主要功能
Class.forName(xxx.xx.xx)返回的是一个类。
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。
A a = (A)Class.forName(“pacage.A”).newInstance();//这和你 A a = new A(); 是一样的效果。
首先,通过Class获取类的字节码
Class clazz = Class.forName("clazz.Test01");
1、获取类的属性
//获取类的属性对象,需要填写属性对象的名称
Field f1=c.getField("name");//只能获取public的对象
Field f2=c.getDeclaredField("age");//可以获取到private的对象,这很吊吧
f2.setAccessible(true);//如果属性是私有的,那么就需要设置可访问
2、利用Constructor创建对象
Constructor c = clazz.getConstructor(null);//获取无参的构造函数
Constructor c = clazz.getConstructor(String.class);//获取参数为String的构造函数
Constructor c = clazz.getConstructor(String.class, int.class);//获取参数为String,int的构造函数
Constructor c = clazz.getDeclaredConstructor(List.class);//获取隐藏为private的构造函数
c.setAccessible(true);//暴力反射
创建对象的另外一种途径,反射出类的无参构造函数并创建对象
Class clazz = Class.forName("com.marer.reflect.Person");
Person p = (Person) clazz.newInstance();
暴力反射获取类的隐藏构造函数:Constructor.setAccessible(true);
3、利用Method 获取类方法
Method[] methods = clazz.getDeclaredMethods();////获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
methods = clazz.getMethods();//获取包括自身和继承(实现)过来的所有的public方法
Method m = clazz.getMethod("t2",String.class);//获取指定方法t2
4、反射调用t2方法
Object o = clazz.newInstance();
m.invoke(o,"123");
package clazz;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class TestClazz {
public static void main(String[] args) throws Exception{
try {
Class<?> clazz = Class.forName("clazz.Test01");
//获取本类的所有方法,存放入数组
Method[] methods = clazz.getDeclaredMethods();////获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
methods = clazz.getMethods();//获取包括自身和继承(实现)过来的所有的public方法
Method m = clazz.getMethod("t2",String.class);
Object o = clazz.newInstance();
m.invoke(o,"123");
System.out.println("-------------------------");
for (Method method : methods) {
System.out.println("方法名:"+method.getName());
//获取本方法所有参数类型,存入数组
Class<?>[] getTypeParameters = method.getParameterTypes();
if(getTypeParameters.length==0){
System.out.println("此方法无参数");
}
for (Class<?> class1 : getTypeParameters) {
String parameterName = class1.getName();
System.out.println("参数类型:"+parameterName);
}
System.out.println("****************************");
}
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println("构造器名:"+constructor.getName());
}
Constructor<?> c1 = clazz.getConstructor(null);
System.out.println("构造器名:"+c1.getName());
Test01 o1 = (Test01)c1.newInstance();
System.out.println(o1);
Constructor<?> c2 = clazz.getConstructor(String.class, String.class);
System.out.println("构造器名:"+c2.getName());
Test01 o2 = (Test01)c2.newInstance("1", "1");
System.out.println(o2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}