Java基础_反射机制

 

 

 

反射机制概念:将类的各个组成部分,封装成对象。

 

 

反射引入:

public class Person {
    private String name;
    private int age;

    public void eat() {}}

同一个字节码文件,在一次程序运行过程中,只会被加载一次,
无论通过哪一种方式获取的Class对象都是同一个。

二 获取Class对象的三种方式

复制代码
// 1 配置文件,类放在配置文件中,读取文件,加载类
        Class cls = Class.forName("com.jh.day01.Person");
        // 多用参数为Class 的参数传递
        Class cls2 = Person.class;
        // 3 多用于对象的获取字节码的方法
        Person person = new Person();
        Class cls3 = person.getClass();
        
        System.out.println(cls);
        System.out.println(cls2);
        System.out.println(cls3);
        
        System.out.println(cls == cls2 );
        System.out.println(cls2 == cls3 );
        
        
        同一个字节码文件,在一次程序运行过程中,只会被加载一次,
        无论通过哪一种方式获取的Class对象都是同一个。
复制代码

三 Class对象的获取功能

复制代码
Class对象的方法:
1 get Fileds:
    Field getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 
    Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 
    Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
    Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 

2 get Constructors
        Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 
        Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 
        Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 
        Constructor<?>[] getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。 

3 get Methods
    Method getMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 
    Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 
    Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 
    Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 

4 get ClassName
    String getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
复制代码

 

 

四 get Fileds案例演练:

java.lang.reflect

类 Field

 

setInt(Object obj, int i)
          将字段的值设置为指定对象上的一个 int 值。

int getInt(Object obj)
          获取 int 类型或另一个通过扩展转换可以转换为 int 类型的基本类型的静态或实例字段的值

toString()
          返回一个描述此 Field 的字符串。

复制代码
// 1 配置文件,类放在配置文件中,读取文件,加载类
        Class cls = Class.forName("com.jh.day01.Person");
        
//        Field getField(String name) 返回一个 Field 对象,指定公共成员字段。 
//        Field[] getFields() 返回所有可访问公共字段。 
        
        Field [] field = cls.getFields();
        for (Field field2 : field) {
            System.out.println(field2);// public int com.jh.day01.Person.a
        }
        Field a = cls.getField("a");
        System.out.println(a);//public int com.jh.day01.Person.a
        
        Person person = new Person();
        Object o1 = a.get(person);
        System.out.println(o1);
        a.set(person, 999);

        System.out.println(person);//Person [name=null, age=0, a=999, b=0, c=0, d=0]
复制代码

 

posted @   I_PENCIL  阅读(22)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示