反射

反射的概念

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Person {
    private String name;
    public int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    private Person(String name) {
        this.name = name;
    }
 
    private String show(String s) {
        return "调用私有方法:" + s;
    }
 
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void Test() throws Exception{
    Class<Person> clazz = Person.class;
    //调用空参构造器
    Person p = clazz.newInstance();
 
    //通过反射,创建Person类的对象
    Constructor<Person> constructor = clazz.getConstructor(String.class, int.class);
    Person p1 = constructor.newInstance("张三", 20);
    System.out.println(p1);//Person{name='张三', age=20}
    //通过反射,调用对象指定的属性、方法
    //设置属性
    Field name = clazz.getDeclaredField("name");
    name.setAccessible(true);
    name.set(p1,"里斯");
    System.out.println(p1);//Person{name='里斯', age=20}
    //调用私有方法
    Method show = clazz.getDeclaredMethod("show", String.class);
    show.setAccessible(true);
    String str = (String) show.invoke(p1, "私有方法");
    System.out.println(str);
 
}

  

 

关于Java.lang.Class类的理解
1.类的加载过程:
程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class),使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程称类的加载。加载到内存中的类,成为运行时类,此运行时类,就作为Class的一个实例。

2.Class的实例对应着一个运行时类。

3.加载到内存中的运行时类,会缓存一定的时间,在此时间之内,可以通过不同的方式来获取此运行时类。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ReflectTest {
 
    @Test
    public void test2() throws ClassNotFoundException {
        //方式一:调用运行时类的属性:.class
        Class clazz1 = Person.class;
 
        //方式二:通过运行时类的对象,调用getClass()
        Person p1 = new Person("aa",10);
        Class clazz2 = p1.getClass();
 
        //方式三:调用Class的静态方法:forName(String classPath) 全类名
        Class clazz3 = Class.forName("mianxiangduixiang.java8.Person");
 
        //方式四:使用类的加载器ClassLoader
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        Class clazz4 = classLoader.loadClass("mianxiangduixiang.java8.Person");
        System.out.println(clazz1==clazz2);//true
        System.out.println(clazz1==clazz3);//true
        System.out.println(clazz1==clazz4);//true
    }
}

  

 

 

 

 

 

  

 

posted @   iTao0128  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-09-04 v-on修饰符
2021-09-04 v-on使用
点击右上角即可分享
微信分享提示