反射02:通过反射动态操作类

来源:互联网 发布:移动网络转换器 编辑:程序博客网 时间:2024/05/22 07:58

本Demo用到的类:User实体类、Demo02测试类

User.java

package reflect;/** * 用户实体类 * @author xhe * */public class User {private String name;private int age;public User() {}public User(String name, int age) {super();this.name = name;this.age = age;}protected String getName() {return name;}protected void setName(String name) {this.name = name;}protected int getAge() {return age;}protected void setAge(int age) {this.age = age;}}



Demo02.java

package reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * 通过反射API动态的操作:构造器、方法、属性 * @author xhe * */public class Demo02 {public static void main(String[] args) throws Exception {String path = "reflect.User";//User类的全路径@SuppressWarnings("unchecked")//压制警告信息Class<User> clazz = (Class<User>)Class.forName(path);//通过反射API调用构造方法,构造对象User user = clazz.newInstance();   //其实是调用了User对象的无参构造方法System.out.println(user);//调用User对象的带参构造方法,需要传递参数类型的classConstructor<User> constructor = clazz.getDeclaredConstructor(String.class,int.class); User user2 = constructor.newInstance("xhe",18);System.out.println(user2.getName());//通过反射API调用普通方法User user3 = clazz.newInstance();Method method = clazz.getDeclaredMethod("setName", String.class);method.invoke(user3, "xhe2");System.out.println(user3.getName());//通过反射API操作属性User user5 = clazz.newInstance();//实例化User类Field field = clazz.getDeclaredField("name");//获取User类的name属性field.setAccessible(true);//这个属性不做安全检查了,可以直接访问field.set(user5,"xhe5");//通过反射直接写属性System.out.println(user5.getName());}}


原创粉丝点击