应用反射的API,获取类的信息(类的名字,属性,方法,构造器)和通过反射API动态的操作构造器,方法,属性
应用反射的API,获取类的信息(类的名字,属性,方法,构造器)
package cn.com.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@SuppressWarnings("all")
public class Demo01 {
//测试应用反射的API,获取类的信息(类的名字,属性,方法,构造器)
public static void main(String[] args) {
String path = "cn.com.reflection.bean.User";
try {
Class clazz = Class.forName(path);
//获取类的名字
System.out.println(clazz.getName());//获取包名加类名
System.out.println(clazz.getSimpleName());//获取类名
//获取属性信息
// Field[] f = clazz.getFields();//只能获得公开的属性 public修饰
Field[] f = clazz.getDeclaredFields();//获得所有的属性
Field f1 = clazz.getDeclaredField("id");//获得id这个属性
System.out.println(f1.getName());
System.out.println(f.length);
for (Field field:f) {
System.out.println("属性:"+field);
}
//获取方法信息
Method[] m = clazz.getDeclaredMethods();//获取所有的方法
// Method m1 = clazz.getDeclaredMethod("getId",null);//获得具体的属性
// Method m2 = clazz.getDeclaredMethod("setId", int.class);//避免重载出现问题,如果方法有参,则必须传递参数类型对应的Class对象
// System.out.println(m1.getName());
// System.out.println(m2.getName());
System.out.println(m.length);
for (Method method:m) {
System.out.println("方法:"+method);
}
//获取构造器信息
Constructor[] c = clazz.getDeclaredConstructors();
Constructor c1 = clazz.getDeclaredConstructor(null);
Constructor c2 = clazz.getDeclaredConstructor(int.class,int.class,String.class);
System.out.println("获得构造器:"+c1);
System.out.println("获得构造器:"+c2);
System.out.println(c.length);
for (Constructor constructor:c) {
System.out.println("构造器:"+constructor);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过反射API动态的操作构造器,方法,属性
package cn.com.reflection;
import cn.com.reflection.bean.User;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@SuppressWarnings("all")
public class Demo02 {
//通过反射API动态的操作:构造器,方法,属性
public static void main(String[] args) {
String path = "cn.com.reflection.bean.User";
try {
// Class<User> clazz = (Class<User>) Class.forName(path);
Class clazz = Class.forName(path);
//通过反射API调用构造方法,构造对象
User u = (User) clazz.newInstance();//其实是调用了User的无参构造器
System.out.println(u);
//通过传递参数类型获得对应的构造方法,然后通过newInstance()传递实参得到对象
Constructor c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
User u2 = (User) c.newInstance(1001,13,"小红");
System.out.println(u2.getName());
//通过反射API调用普通方法
User u3 = (User) clazz.newInstance();
Method m = clazz.getDeclaredMethod("setName", String.class);
m.setAccessible(true);
m.invoke(u3,"小明");//激活
System.out.println(u3.getName());
//通过反射API操作属性
User u4 = (User) clazz.newInstance();
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);//这个属性不用做安全检查了,可以直接访问(也就是访问各种权限)
f.set(u4,"小亮");//通过反射直接写属性的值
System.out.println(u4.getName());//通过反射直接读属性的值
System.out.println(f.get(u4));
} catch (Exception e) {
e.printStackTrace();
}
}
}