package java_212_反射机制_动态操作_构造器_方法_属性_练习;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
- 通过反射API动态的操作:构造器,方法 属性等的调用
*/
@SuppressWarnings(“all”)
public class Demo03 {
public static void main(String[] args) {
//实现动态加载
String path = “java_212_反射机制_动态操作_构造器_方法_属性_练习.User”;//路径 ;包+类名
//创建动态对象
try {
//通过反射API调用构造方法,构造对象;newInstance新 实例
Class clazz = Class.forName(path);
User u1 = (User)clazz.newInstance();//强制转型;其实是调用了User的无参构造方法
System.out.println(u1);//注意 如果出现报错 提示类型转换错误;有可能是String path路径没有写对
/Class clazz = (Class) Class.forName(path);//转型也可以在这里做 下面就不用转型
User u2 = clazz.newInstance();//其实是调用了User的无参构造方法
System.out.println(u2);/
//指定构造器
Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
User us = c.newInstance(1001,20,"张三");//需要添加具体数据即传递实参
System.out.println(us.getId()+":"+us.getAge()+":"+us.getUname());
System.out.println("====通过反射API调用普通方法====");
//通过反射API调用普通方法
User u3 = (User) clazz.newInstance();
//u3.setUname("李四");//这是直接调
//通过反射调 ;好处是 方法名和参数都是变量;方便以后动态使用
Method method = clazz.getDeclaredMethod("setUname", String.class);
//调用;
method.invoke(u3, "李四");//invoke调用;
System.out.println(u3.getUname());
System.out.println("====通过反射API操作属性====");
//通过反射API操作属性
User u4 = (User) clazz.newInstance();
Field f = clazz.getDeclaredField("uname");//获取对应的属性uname
//如果不通过反射就会报错;解决方法
f.setAccessible(true);//setAccessible设置访问;这个属性不需要做安全检查了,可以直接访问
f.set(u4, "王五");//如果不通过反射运行后这里报错 因为private String uname是内部使用的
System.out.println(u4.getUname());//直接调用
//另一个方法获取
System.out.println(f.get(u4));//通过反射调用
} catch (Exception e) {
e.printStackTrace();
}
}
}
//------------------属性-----------------------------------
package java_212_反射机制_动态操作_构造器_方法_属性_练习;
/**
-
属性
*/
public class User {
private int id;
private int age;
private String uname;
//get与set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
//构造器
public User() {}
public User(int id, int age, String uname) {
super();
this.id = id;
this.age = age;
this.uname = uname;
}
}
//结果-----------------------------------------
java_212_反射机制_动态操作_构造器_方法_属性_练习.User@1db9742
1001:20:张三
通过反射API调用普通方法
李四
通过反射API操作属性
王五
王五