package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflect {
public static void main(String[] args) {
try {
Class clazz=Class.forName("reflect.User");
//获得 包名和类型
System.out.println(clazz.getName()); //reflect.User
//获取类名
System.out.println(clazz.getSimpleName());//User
//获取所有属性信息
Field[] fields=clazz.getDeclaredFields();
for(Field field:fields){
System.out.println(field);
/**
* private int reflect.User.id
private int reflect.User.age
private java.lang.String reflect.User.uname
*/
}
//获取指定属性信息
Field field=clazz.getDeclaredField("uname");
System.out.println(field);//private java.lang.String reflect.User.uname
//获取方法信息
Method[] methods=clazz.getDeclaredMethods();
Method method=clazz.getDeclaredMethod("getUname", null);
//如果方法有参,则必须传递参数类型对应的class对象
Method method1=clazz.getDeclaredMethod("setUname", String.class);
for(Method m:methods){
System.out.println(m);
}
//获得构造器信息
Constructor[] constructors= clazz.getDeclaredConstructors();
clazz.getDeclaredConstructor(int.class,int.class,String.class);
for(Constructor c:constructors){
System.out.println(c);
}
System.out.println("#####################");
//调用构造方法 实例化对象
User user=(User)clazz.newInstance();
System.out.println(user);//reflect.User@25154f
//调用有参数的构造器
Constructor constructor=clazz.getDeclaredConstructor(int.class,int.class,String.class);
User user2=(User) constructor.newInstance(10,12,"xiaoming");
System.out.println(user2.getUname());//xiaoming
//调用普通方法
User user3=(User)clazz.newInstance();
Method method2=clazz.getDeclaredMethod("setUname", String.class);
method2.invoke(user3, "xiaoming");
System.out.println(user3.getUname());//xiaoming
//调用属性
User user4=(User) clazz.newInstance();
Field f=clazz.getDeclaredField("uname");
//这个属性不需要做安全检查了,可以直接访问
f.setAccessible(true);
f.set(user4, "xiaoming");
System.out.println(user4.getUname());//xiaoming
System.out.println(f.get(user4));//xiaoming
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
通过反射获取构造方法,属性,方法信息
最新推荐文章于 2023-04-18 11:18:09 发布