反射

反射

概述

Reflection(反射)被视为动态语言的关键。在程序执行期借助反射API获取类的内部信息,从而操作类的属性及方法。

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Person{
private String name;
public int age;

public Person(){}
public Person(String name,int age){
this.name = name;
this.age =age;
}
private Person(String name){
this.name = name;
}
...
public getXxx()/SetXxx()
...
public toString(){}
public show(){}
private String show(String msg){}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Class clazz = Person.class;
//1.创建对象
Constructor cons = clazz.getContructor(String.class,int.class);
Person p = (Person)cons.newInstance("Tom",12);//构建对象p
//2.调用属性
Field age = clazz.getDeclaredField("age");
age.set(p,10);//对象p属性age赋值
//3.调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p)//对象p调用show方法
//4.调用私有构造方法
Constructor cons1 = clazz.getDeclaredConstructor(String.class);
cons1.setAccessible(true);
Person p1 = (Person)cons1.newInstance("Jack");
//5.调用私有属性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"Jack1");
//6.调用私有方法
Method show = clazz.getDeclaredMethod("show",String.class);
show.setAccessible(true);
String msg = (String)show.invoke(p1,"你好世界");//调用方法并获取返回值

获取Class实例的方法

1
2
3
4
5
6
7
8
9
10
//方式1:调用运行时类的属性 .calss
Class clazz1 = Person.class;
//方式2:调用运行时类的对象方法 .getClass()
Person p = new Person();
Class clazz2 = p.getClass();
//方式3:调用Class的静态方法 .forName(String classPath)
Class clazz3 = Class.forName("java.lang.String");
//方式4:调用类的加载器 .getClassLoader()
ClassLoader classLoader = currentClass.class.getClassLoader();
Class clazz4 = classLoader.loadClass("java.lang,String")

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!