反射是jvav被视为动态语言的关键,可以让程序创建和控制任何类的对象,无需提前硬编码目标类,极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。使得对象能在程序执行过程中动态生成。
下面是演示:
首先创建一个User类用于演示
class User {
private String name = "这是一个name";
private int age = 20;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
private User(String name) {
this.name = name;
this.age = 999;
}
private String info() {
return "从jvav到架构师";
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
}
下面将采用反射机制创建User对象
package com.company.class_;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Class03 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("com.company.class_.User");
Object o1 = cls.newInstance(); //使用构造器:public User()
Constructor m2 = cls.getDeclaredConstructor(String.class, int.class);
m2.setAccessible(true);
Object o2 = m2.newInstance("这是另一个人名", 1926);//使用构造器:public User(String name, int age)
Constructor m3 = cls.getDeclaredConstructor(String.class);
m3.setAccessible(true);
Object o3 = m3.newInstance("这是另一个人名");//使用构造器:private User(String name)
Method getName = cls.getMethod("getName");//使用反射机制访问public方法
System.out.println("o1的名字是:" + getName.invoke(o1) + " " + o1);
System.out.println("o2的名字是:" + getName.invoke(o2) + " " + o2);
System.out.println("o3的名字是:" + getName.invoke(o3) + " " + o3);
System.out.println();
Method info = cls.getDeclaredMethod("info");//使用反射机制访问private方法
info.setAccessible(true);//使用反射爆破 可访问private成员
System.out.println(info.invoke(o1));
System.out.println();
System.out.println(o1);
Field x = o1.getClass().getDeclaredField("age");
x.setAccessible(true);
x.set(o1, 333);//修改private属性
System.out.println(o1);
System.out.println();
Class f = Class.forName("java.io.File");//使用反射机制创建文件
//f.newInstance();
Constructor ff = f.getDeclaredConstructor(String.class);
Object o = ff.newInstance("D:/Java/File/Class.txt");
Method mf1 = f.getDeclaredMethod("createNewFile");
mf1.invoke(o);
System.out.println("创建文件完成");
}
}
结果演示: