反射的操作方法

电玩女神 2021-12-20 03:25 342阅读 0赞

目标:通过反射获得User类的Class对象,得到该类的所有信息,构造User类的对象,调用普通方法,操作属性。

*创建User类(方便演示)

  1. package Reflect;
  2. public class User {
  3. public int id;
  4. protected int age;
  5. private String uname;
  6. public User(){
  7. }
  8. public User(int id, int age, String uname) {
  9. super();
  10. this.id = id;
  11. this.age = age;
  12. this.uname = uname;
  13. }
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public int getAge() {
  21. return age;
  22. }
  23. public void setAge(int age) {
  24. this.age = age;
  25. }
  26. public String getUname() {
  27. return uname;
  28. }
  29. public void setUname(String uname) {
  30. this.uname = uname;
  31. }
  32. }

(一) 获得该类的所有信息演示:

  1. System.out.println("========================获得Class对象===================================");
  2. Class class1=Class.forName("Reflect.User");
  3. System.out.println("========================获得类的名字===================================");
  4. System.out.println(class1.getName());//获得包名+类名
  5. System.out.println(class1.getSimpleName());//获得类名
  6. System.out.println("========================获得可访问属性===================================");
  7. //获得public修饰的属性
  8. Field[] field1=class1.getFields();
  9. for(Field fs:field1){
  10. System.out.println(fs);
  11. }
  12. System.out.println("==========");
  13. //获得所有的属性
  14. Field[] field2=class1.getDeclaredFields();
  15. for(Field fs:field2){
  16. System.out.println(fs);
  17. }
  18. System.out.println("==========");
  19. //获得单独属性(name的属性)
  20. Field field3=class1.getDeclaredField("name");
  21. System.out.println(field3);
  22. System.out.println("========================获得的类方法===================================");
  23. //获取类的所有方法
  24. Method[] methods=class1.getDeclaredMethods();
  25. for(Method m:methods){
  26. System.out.println(m);
  27. }
  28. //获取类的单独方法
  29. Method m01=class1.getDeclaredMethod("getUname", null);//用于区分重载方法
  30. System.out.println(m01);
  31. Method m02=class1.getDeclaredMethod("setUname", String.class);//用于区分重载方法
  32. System.out.println(m02);

(二)构造User类对象

1)无参构造

  1. 方法一:
  2. Class c=Class.forName("Reflect.User");
  3. User u1=(User) c.newInstance();
  4. 方法二
  5. Class<User> c=(Class<User>)Class.forName("Reflect.User");
  6. User u1=c.newInstance();

2)有参构造

  1. Constructor<User> c=clazz.getDeclaredConstructor(int.class,int.class,String.class);//获得有参构造器方法
  2. User u2=c.newInstance(1,18,"wang2");
  3. System.out.println(u2.getUname());//wang2

(三)调用普通方法

  1. //方法一
  2. User u3=clazz.newInstance();
  3. u3.setUname("wang3");
  4. //方法二(建议使用)
  5. User u3=clazz.newInstance();
  6. Method method=clazz.getDeclaredMethod("setUname",String.class);//获得了setUname(string){}方法
  7. method.invoke(u3, "wang33"); //invoke表示激活
  8. System.out.println(u3.getUname());

两方法比较:方法二更常用,因为获得的方法可以是从其他(数据库、游览器、文件)调过来的变量,体现反射的动态性,灵活度更高。

(四)操作属性

1)获得普通属性(注:用此方法获得私有属性会报错)

  1. User u4=clazz.newInstance();
  2. Field f=clazz.getDeclaredField("id");//获得了id属性
  3. f.set(u4, 4);
  4. System.out.println(u4.getId()); //4

2)获得private…等属性

  1. User u4=clazz.newInstance();
  2. Field f=clazz.getDeclaredField("uname");//获得uname属性
  3. f.setAccessible(true);//这个属性不需要做安全检查,可以直接访问
  4. f.set(u4, "wang4");
  5. System.out.println(u4.getUname()); //System.out.println(f1.get(u4));

说明:setAccessible-启用和禁用访问安全检查的开关,true为关闭,false(默认)为开启。
注意:setAccessible检查需要耗时间,影响效率,有时候可以关闭以此来提高反射效率。

(五)操作泛型、操作注解(未完待续)

发表评论

表情:
评论列表 (有 0 条评论,342人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VTK:使用方法编程

    VTK(Visualization Toolkit)是一个功能强大的开源图形库,用于可视化和处理大规模的科学和工程数据。在VTK中,反射是一种强大的技术,可以在运行时动态地获取

    相关 使用

    概述     JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态

    相关 操作方法

    目标:通过反射获得User类的Class对象,得到该类的所有信息,构造User类的对象,调用普通方法,操作属性。  \创建User类(方便演示) package R