反射的使用

亦凉 2022-04-18 05:25 317阅读 0赞

概述

  1. JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
  2. 每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。
  3. Class 类与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了 Field,Method,Constructor (每个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。

使用

首先创建几个测试类和接口:

  1. /**
  2. * Hello world!
  3. *
  4. */
  5. public class App
  6. {
  7. private Integer weight;
  8. private Integer height;
  9. public App(Integer weight, Integer height) {
  10. super();
  11. this.weight = weight;
  12. this.height = height;
  13. }
  14. public App() {
  15. super();
  16. }
  17. @Override
  18. public String toString() {
  19. return "App [weight=" + weight + ", height=" + height + "]";
  20. }
  21. }
  22. /*
  23. * @author zzf
  24. * @date 2018年11月6日 下午2:18:39
  25. */
  26. public interface InterfaceA {
  27. }
  28. /*
  29. * @author zzf
  30. * @date 2018年11月6日 下午2:44:32
  31. */
  32. public class U {
  33. private String type;
  34. public U(String type) {
  35. super();
  36. this.type = type;
  37. };
  38. public U() {
  39. super();
  40. }
  41. public String getType() {
  42. return type;
  43. }
  44. public void setType(String type) {
  45. this.type = type;
  46. };
  47. }
  48. /*
  49. * @author zzf
  50. * @date 2018年11月6日 上午11:00:55
  51. */
  52. public class User extends U{
  53. private String name;
  54. private Integer age;
  55. public App app;
  56. public String getName() {
  57. return name;
  58. }
  59. public void setName(String name) {
  60. this.name = name;
  61. }
  62. public Integer getAge() {
  63. return age;
  64. }
  65. public void setAge(Integer age) {
  66. this.age = age;
  67. }
  68. public App getApp() {
  69. return app;
  70. }
  71. public void setApp(App app) {
  72. this.app = app;
  73. }
  74. public User(String name, Integer age, App app) {
  75. super();
  76. this.name = name;
  77. this.age = age;
  78. this.app = app;
  79. }
  80. public User(String name, Integer age) {
  81. super();
  82. this.name = name;
  83. this.age = age;
  84. }
  85. private User(String name) {
  86. super();
  87. this.name = name;
  88. }
  89. public User() {
  90. super();
  91. }
  92. @Override
  93. public String toString() {
  94. return "User [name=" + name + ", age=" + age + ", app=" + app + "]";
  95. }
  96. private String aaa() {
  97. return "User [name=" + name + ", age=" + age + ", app=" + app + "]";
  98. }
  99. public String User(String name, Integer age, App app) {
  100. this.name = name;
  101. this.age = age;
  102. this.app = app;
  103. return toString();
  104. }
  105. private class P {
  106. private String p;
  107. public P(String p) {
  108. super();
  109. this.p = p;
  110. }
  111. public String getP() {
  112. return p;
  113. }
  114. public void setP(String p) {
  115. this.p = p;
  116. }
  117. }
  118. }

测试demo:

  1. import java.lang.reflect.*;
  2. /*
  3. * @author zzf
  4. * @date 2018年11月6日 上午10:57:31
  5. */
  6. public class Text {
  7. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
  8. //返回与给定字符串名称的类或接口相关联的类对象。
  9. //三种方式
  10. Class user=Class.forName("reflect.User");
  11. System.out.println(user.toGenericString());//public class reflect.User
  12. Class app=User.class;
  13. System.out.println(app.toGenericString());//public class reflect.User
  14. System.out.println(new User().getClass().toGenericString());//public class reflect.User
  15. //返回类的限定符,在toGenericString源码中可寻
  16. int modifiers = app.getModifiers() & Modifier.classModifiers();
  17. String s=Modifier.toString(modifiers);
  18. System.out.println(s);//public
  19. //创建一个User类的实例
  20. Object userObj=Class.forName("reflect.User").newInstance();//默认构造器
  21. System.out.println((User)userObj);//User [name=null, age=null, app=null]
  22. //判断实例是否为该类
  23. System.out.println(user.isInstance(new User()));//true
  24. //是否是该class对象
  25. System.out.println(user.isAssignableFrom(User.class));//true
  26. //判断该反射对象是否是接口
  27. System.out.println("接口:"+Class.forName("reflect.InterfaceA").isInterface());//true
  28. System.out.println("类:"+Class.forName("reflect.User").isInterface());//true
  29. //判断指定的类对象是否表示基元类型
  30. System.out.println(int.class.isPrimitive());//true
  31. System.out.println(User.class.isPrimitive());//false
  32. //打印类的全限定名
  33. System.out.println(Class.forName("reflect.User").getName());//reflect.User
  34. System.out.println(User.class.getName());//reflect.User
  35. //获取类加载器
  36. System.out.println("类加载器:"+Class.forName("reflect.User").getClassLoader());//sun.misc.Launcher$AppClassLoader@18b4aac2
  37. //获取它的超类对象
  38. System.out.println(Class.forName("reflect.User").getSuperclass());//class reflect.U
  39. System.out.println(Class.forName("reflect.User").getGenericSuperclass());//class reflect.U
  40. //获取它的包名
  41. System.out.println("包:"+Class.forName("reflect.User").getPackage());//包:package reflect
  42. //返回类修饰符所对应的int值,在Modifier类中可寻
  43. System.out.println(Class.forName("reflect.User").getModifiers());//1
  44. //返回类名
  45. System.out.println(Class.forName("reflect.User").getSimpleName());//User
  46. System.out.println(Class.forName("java.lang.String").getSimpleName());//String
  47. //根据类反射字段,方法,构造器等,public标识符
  48. Field[] field=Class.forName("reflect.User").getFields();//app,
  49. for(Field f:field)
  50. System.out.print(f.getName()+",");
  51. System.out.println();
  52. Method[] method=Class.forName("reflect.User").getMethods();//toString,getName,setName,User,getAge,setAge,getApp,setApp,getType,setType,wait,wait,wait,equals,hashCode,getClass,notify,notifyAll,
  53. for(Method f:method)
  54. System.out.print(f.getName()+",");
  55. System.out.println();
  56. Constructor<?>[] constructor=Class.forName("reflect.User").getConstructors();//reflect.User|2:class java.lang.String,class java.lang.Integer,reflect.User|0:reflect.User|3:class java.lang.String,class java.lang.Integer,class reflect.App,
  57. for(Constructor f:constructor){
  58. System.out.print(f.getName()+"|"+f.getParameterCount()+":");
  59. for (Parameter p:f.getParameters()){
  60. System.out.print(p.getType()+",");
  61. }
  62. }
  63. System.out.println();
  64. //获取单个字段或者方法或者构造器,public
  65. Field f=Class.forName("reflect.User").getField("app");//public reflect.App reflect.User.app
  66. System.out.println(f);
  67. Method m=Class.forName("reflect.User").getMethod("toString");//public java.lang.String reflect.User.toString()
  68. System.out.println(m);
  69. Constructor con=Class.forName("reflect.User").getConstructor();//User [name=null, age=null, app=null]
  70. System.out.println(con.newInstance());
  71. Constructor con2=Class.forName("reflect.User").getConstructor(String.class,Integer.class);//User [name=1111, age=11, app=null]
  72. System.out.println(con2.newInstance("1111",11));
  73. //返回所有的字段,方法,或者构造器
  74. //返回成员类
  75. Class<?>[] dec=Class.forName("reflect.User").getDeclaredClasses();//reflect.User$P,
  76. for(Class text:dec)
  77. System.out.print(text.getName()+",");
  78. System.out.println();
  79. Field[] fie=Class.forName("reflect.User").getDeclaredFields();//返回所有的字段:name,age,app,
  80. for(Field text:fie)
  81. System.out.print(text.getName()+",");
  82. System.out.println();
  83. Method[] met=Class.forName("reflect.User").getDeclaredMethods();//返回所有方法:toString,getName,setName,aaa,User,getAge,setAge,getApp,setApp,
  84. for(Method text:met)
  85. System.out.print(text.getName()+",");
  86. System.out.println();
  87. Constructor<?>[] cons=Class.forName("reflect.User").getDeclaredConstructors();//返回所有构造器:app|2:class java.lang.String,class java.lang.Integer,app|1:class java.lang.String,app|0:app|3:class java.lang.String,class java.lang.Integer,class reflect.App,
  88. for(Constructor text:cons){
  89. System.out.print(f.getName()+"|"+text.getParameterCount()+":");
  90. for (Parameter p:text.getParameters()){
  91. System.out.print(p.getType()+",");
  92. }
  93. }
  94. System.out.println();
  95. //返回任意字段,方法,构造器,包括私有
  96. Field df=Class.forName("reflect.User").getDeclaredField("name");//private java.lang.String reflect.User.name
  97. System.out.println(df);
  98. Method dm=Class.forName("reflect.User").getDeclaredMethod("aaa");//private java.lang.String reflect.User.aaa()
  99. System.out.println(dm);
  100. Constructor dc=Class.forName("reflect.User").getDeclaredConstructor(String.class);//private reflect.User(java.lang.String)
  101. System.out.println(dc);
  102. //通过反射创建对象,使用私有构造器创建
  103. Constructor dcc=Class.forName("reflect.User").getDeclaredConstructor(String.class);//返回构造器,包括私有
  104. dcc.setAccessible(true);//暴力破解
  105. Object a=dcc.newInstance("SSSSSSSSS");
  106. System.out.println(a);//User [name=SSSSSSSSS, age=null, app=null]
  107. //通过反射调用私有方法
  108. Method dms=Class.forName("reflect.User").getDeclaredMethod("aaa");
  109. dms.setAccessible(true);
  110. System.out.println(dms.invoke(a, null));//User [name=SSSSSSSSS, age=null, app=null]
  111. System.out.println(dms.invoke(Class.forName("reflect.User").newInstance(), null));//User [name=null, age=null, app=null]
  112. /*************************************************/
  113. //结合以上内容综合使用
  114. Method Amethon=Class.forName("reflect.User").getDeclaredMethod("User",String.class,Integer.class,App.class);
  115. Object value = Amethon.invoke(Class.forName("reflect.User").newInstance(), "aaa",12,Class.forName("reflect.App")
  116. .getDeclaredConstructor(Integer.class,Integer.class).newInstance(100,200));
  117. System.out.println(value);//User [name=aaa, age=12, app=App [weight=100, height=200]]
  118. }
  119. }

运行后:

  1. public class reflect.User
  2. public class reflect.User
  3. public class reflect.User
  4. public
  5. User [name=null, age=null, app=null]
  6. true
  7. true
  8. 接口:true
  9. 类:false
  10. true
  11. false
  12. reflect.User
  13. reflect.User
  14. 类加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
  15. class reflect.U
  16. class reflect.U
  17. 包:package reflect
  18. 1
  19. User
  20. String
  21. app,
  22. toString,getName,setName,User,getApp,setAge,getAge,setApp,getType,setType,wait,wait,wait,equals,hashCode,getClass,notify,notifyAll,
  23. reflect.User|2:class java.lang.String,class java.lang.Integer,reflect.User|0:reflect.User|3:class java.lang.String,class java.lang.Integer,class reflect.App,
  24. public reflect.App reflect.User.app
  25. public java.lang.String reflect.User.toString()
  26. User [name=null, age=null, app=null]
  27. User [name=1111, age=11, app=null]
  28. reflect.User$P,
  29. name,age,app,
  30. toString,getName,setName,aaa,User,getApp,setAge,getAge,setApp,
  31. app|2:class java.lang.String,class java.lang.Integer,app|1:class java.lang.String,app|0:app|3:class java.lang.String,class java.lang.Integer,class reflect.App,
  32. private java.lang.String reflect.User.name
  33. private java.lang.String reflect.User.aaa()
  34. private reflect.User(java.lang.String)
  35. User [name=SSSSSSSSS, age=null, app=null]
  36. User [name=SSSSSSSSS, age=null, app=null]
  37. User [name=null, age=null, app=null]
  38. User [name=aaa, age=12, app=App [weight=100, height=200]]

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NTk4MDEx_size_16_color_FFFFFF_t_70

发表评论

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

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

相关阅读

    相关 使用

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