Java反射机制
Java反射机制是在运行状态中对于任意一个类都能获取到它的属性和方法。这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射机制,想要使用反射就必选获取到字节码文件。
类加载进内存的时机
1.创建类的实例
2.访问类的静态变量,或者为静态变量赋值
3.调用类的静态方法
4.初始化某个类的子类
5.使用反射来强制创建某个类或者接口的class对象
Person类
public class Person {
public String name;
Integer age;
private String gender;
public Person() {
super();
System.out.println("这是无参构造");
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
System.out.println("有参构造");
}
public void show(){
System.out.println("我是"+this.name+"年龄"+this.age);
}
public void eat(String str){
System.out.println("我今天吃了"+str);
}
public static void main(String[] args) {
char s='中';
System.out.println((int)s);
}
}
一.获取字节码的三种方式
//1.通过使用Class.forName()方法
Class<?> clazz1 = Class.forName("com.ecit.testClass.Person");
//2.通过class静态属性
Class clazz2 = Person.class;
//3.通过对象的getclass方法
Person p1 = new Person();
Class<?> clazz3 = p1.getClass();
二.通过字节码创建对象
//1.获取无参构造器
Person p11 = (Person)clazz1.newInstance();
//2.获取带参构造器
Constructor c = clazz1.getConstructor(String.class,Integer.class);
Person p2 = (Person)c.newInstance("张三",21);
System.out.print("获得有参构造调用show()方法:");
p2.show();
三.通过字节码获取字段
//1.获取公有字段
Field f = clazz1.getField("name");
f.set(p2, "李四");
System.out.print("获得公有字段并修改name:");
p2.show();
//2.获取私有字段
Field f2 = clazz1.getDeclaredField("age");
f2.setAccessible(true);
f2.set(p2, 22);
System.out.print("获得公有字段并修改age:");
p2.show();
四.通过字节码获取方法
//1.获取公有方法
Method m1 = clazz1.getMethod("show");
System.out.println("获得的公有方法名字是:"+m1.getName());
System.out.print("获得公有方法show()并调用:");
m1.invoke(p2);//调用p2对象中的show方法
//2.获取私有方法
Method m2 = clazz1.getDeclaredMethod("eat", String.class);
m2.setAccessible(true);
System.out.print("获得获得私有方法eat()并调用:");
m2.invoke(p2,"米饭");
运行结果
这是无参构造
这是无参构造
有参构造
获得有参构造调用show()方法:我是张三年龄21
获得公有字段并修改name:我是李四年龄21
获得公有字段并修改age:我是李四年龄22
获得的公有方法名字是:show
获得公有方法show()并调用:我是李四年龄22
获得获得私有方法eat()并调用:我今天吃了米饭