Java的反射机制一起来看看

 更新时间:2022年03月14日 14:50:59   作者:aigo-2021  
这篇文章主要为大家详细介绍了Java反射机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、什么是反射机制?

反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;

获得Class类对象的三种方式:

方式一 :Class.forName(“类名”);

Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。

Class cls = Class.forName("com.oracle.vo.Person");

方式二: 类名.class

要求运行的类库一定要有Person类

//编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型
//会为每个类定义一个属性,存储自己类的类对象
Class cls = Person.class;

方式三: 对象.getClass()

要求运行的类库中一定要有Person类 当持有了一个对象时,可以根据对象获得其类对象

Person p = new Person();
//getClass方法是Object类的方法,所有的对象都有getClass方法
Class cls = p.getClass();

二、Class类

API方法

1. getName() 获得类对象对应类的类名(全类名:包名+类名)

2. getSimpleName() 获得类对象对应类的类名

3. getPackage() 获得类对象对应类的包对象

try {
    Class cls = Class.forName("com.oracle.vo.Person");
    System.out.println(cls.getName());
    System.out.println(cls.getSimpleName());
    Package page = cls.getPackage();
    System.out.println(page.getName());
    } catch (ClassNotFoundException e) {
 
    e.printStackTrace();
}

4. getField(String name) 根据名字获得能访问的属性。

5. getDeclaredField(String name) 根据名字获得属性。

6. getDeclaredFields() 获得所有的属性

7. getDeclaredMethod()

8. getDeclaredConstructor(Class... types) 根据参数列表获得构造器

9. newInstance() 通过无参构造器创建对象

10. getSuperClass() 获得父类的类对象

三、Package类

Package对象抽象为包

四、Field类

是属性的抽象,Field类的实例就是某个属性,Field类包括了属性名、属性类型、属性值、修饰范围等。

获得属性对象,主要的作用是对属性进行赋值或取值的操作。

1. get(Object obj) 返回Object :获得某个对象的属性值。

2. setAccessible(boolean flag) : 设置属性是否可访问。

3. set(Object obj,Object value) : 设置属性值

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得Person类中所有的属性
            Field[] fields = cls.getFields();
            //获得Person类中的name属性
            Field field = cls.getDeclaredField("name");
            System.out.println(field.getName());
            //获得 某个Person对象 的name属性值
            //field: Person类的name属性
            //设置这个属性可访问,忽略修饰范围
            field.setAccessible(true);
            //设置p对象的name属性值 为jack
            field.set(p, "jack");
            System.out.println(field.get(p));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

五、Method类

invoke(Object obj, Object ... args) 返回Object : 执行method方法

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得Person类的 method(String name) 方法对象
            Method method1 = cls.getDeclaredMethod("method", String.class);
            //获得Person类的 method() 方法对象
            Method method2 = cls.getDeclaredMethod("method");
            //method(int i,String name) 方法对象
            Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
            //获得全部方法
            Method[] methods = cls.getDeclaredMethods();
            //获得方法要作什么? 就是要调用方法
            //obj参数: 调用哪个对象的方法
            method1.invoke(p, "abc");
            System.out.println(method3.invoke(p, 10,"abcd"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

六、Constructor类

newInstance(Object ... args) 调用构造器创建对象

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得 public Person() 构造器
            Constructor constructor1 = cls.getDeclaredConstructor();
            //public Person(String name, int age) 构造器
            Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
            //获得构造器的作用,要调用构造器创建对象
            Object obj1 = constructor1.newInstance();
            Object obj2 = constructor2.newInstance("tom",20);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容! 

相关文章

  • Java有哪些操作字符串的类?区别在哪?

    Java有哪些操作字符串的类?区别在哪?

    今天给大家爱带来的是关于Java的相关知识,文章围绕着Java操作字符串的类展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot3集成Swagger3的详细教程

    SpringBoot3集成Swagger3的详细教程

    Swagger 3(OpenAPI 3.0)提供了更加强大和灵活的API文档生成能力,本教程将指导您如何在Spring Boot 3项目中集成Swagger3,并使用Knife4j作为UI界面,需要的朋友可以参考下
    2024-03-03
  • 详细解读java同步之synchronized解析

    详细解读java同步之synchronized解析

    synchronized关键字是Java里面最基本的同步手段,下面我们来一起学习一下
    2019-05-05
  • Java设计模式之单例和原型

    Java设计模式之单例和原型

    这篇文章介绍了Java设计模式之单例和原型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • SpringBoot security安全认证登录的实现方法

    SpringBoot security安全认证登录的实现方法

    这篇文章主要介绍了SpringBoot security安全认证登录的实现方法,也就是使用默认用户和密码登录的操作方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • struts中动态方法调用使用通配符

    struts中动态方法调用使用通配符

    这篇文章主要介绍了struts中动态方法调用使用通配符的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Spring Data JPA进行数据分页与排序的方法

    Spring Data JPA进行数据分页与排序的方法

    这篇文章主要介绍了Spring Data JPA进行数据分页与排序的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • RestTemplate get请求携带headers自动拼接参数方式

    RestTemplate get请求携带headers自动拼接参数方式

    这篇文章主要介绍了RestTemplate get请求携带headers自动拼接参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java实现发送邮件的示例代码

    java实现发送邮件的示例代码

    这篇文章主要介绍了java如何实现发送邮件,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java微信支付之公众号支付、扫码支付实例

    Java微信支付之公众号支付、扫码支付实例

    微信支付已经成为生活中必不可少的付款方式,本篇文章主要介绍了Java微信支付之公众号支付、扫码支付,有需要的小伙伴可以了解一下。
    2016-11-11

最新评论