反射

获取类的方法:

  1. Class<?> aClass1 = Class.forName("TestDemo.refection.User");//通过类路径获取
  2. Class<User> userClass = User.class;//通过类名获取
  3. User user = new User();
  4. Class<? extends User> aClass = user.getClass();//通过实例对象获取

无论通过哪种方式获取,获取几个都是一个Class的实例:

  1. Class<?> aClass1 = Class.forName("TestDemo.refection.User");
  2. Class<?> aClass2 = Class.forName("TestDemo.refection.User");
  3. Class<User> userClass = User.class;
  4. User user = new User();
  5. Class<? extends User> aClass = user.getClass();
  6. System.out.println(aClass1.hashCode());
  7. System.out.println(aClass2.hashCode());
  8. System.out.println(userClass.hashCode());
  9. System.out.println(aClass.hashCode());
  10. /*
  11. 结果:
  12. 1360875712
  13. 1360875712
  14. 1360875712
  15. 1360875712
  16. 可以看出它们的hashCode都是一样的
  17. */

通过反射获取相应的Class类后,获取相应的方法、属性、构造器

  1. public class Test04 {
  2. public static void main(String[] args) throws Exception {
  3. Class<?> aClass = Class.forName("TestDemo.refection.User1");
  4. System.out.println(aClass.getName());//获取全类名
  5. System.out.println(aClass.getSimpleName());//获取简单的类名
  6. System.out.println("=========================================");
  7. Field[] fields = aClass.getFields();//获取公有的属性
  8. for (Field field : fields) {
  9. System.out.println("public:" +field);
  10. }
  11. fields = aClass.getDeclaredFields();//获取全部(包括公有和私有)的属性
  12. for (Field field : fields) {
  13. System.out.println("getDeclaredFields:" +field);
  14. }
  15. System.out.println("=========================================");
  16. System.out.println("获取所有公有的方法,包括父类的:");
  17. Method[] methods = aClass.getMethods();
  18. for (Method method : methods) {
  19. System.out.println(method);
  20. }
  21. System.out.println("获取自己所有的方法,包括私有的:");
  22. methods = aClass.getDeclaredMethods();
  23. for (Method method : methods) {
  24. System.out.println(method);
  25. }
  26. System.out.println("获取指定的公有的方法(包括父类的方法):");
  27. Method setName = aClass.getMethod("setName", String.class);
  28. System.out.println(setName);
  29. Method notify = aClass.getMethod("notify");
  30. System.out.println(notify);
  31. System.out.println("获取指定的全部的方法(包括父类的方法,包括私有的方法):");
  32. Method test = aClass.getDeclaredMethod("test");
  33. System.out.println(test);
  34. System.out.println("=========================================");
  35. System.out.println("获取全部公有(自身的)的构造器:");
  36. Constructor<?>[] constructors = aClass.getConstructors();
  37. for (Constructor<?> constructor : constructors) {
  38. System.out.println(constructor);
  39. }
  40. System.out.println("获取全部(自身的,包括私有的)的构造器");
  41. constructors = aClass.getDeclaredConstructors();
  42. for (Constructor<?> constructor : constructors) {
  43. System.out.println(constructor);
  44. }
  45. System.out.println("获取指定的构造器(不包括私有的):");
  46. System.out.println(aClass.getConstructor());
  47. System.out.println("获取指定的构造器(包括私有的):");
  48. System.out.println(aClass.getDeclaredConstructor(String.class));
  49. }
  50. }
  51. class Fater1{
  52. public Fater1(){}
  53. }
  54. class User1 extends Fater1{
  55. private String name;
  56. private int id;
  57. public int age;
  58. public User1() {
  59. }
  60. private User1(String name) {
  61. this.name = name;
  62. }
  63. public User1(String name, int id, int age) {
  64. this.name = name;
  65. this.id = id;
  66. this.age = age;
  67. }
  68. public String getName() {
  69. return name;
  70. }
  71. public void setName(String name) {
  72. this.name = name;
  73. }
  74. public int getId() {
  75. return id;
  76. }
  77. public void setId(int id) {
  78. this.id = id;
  79. }
  80. public int getAge() {
  81. return age;
  82. }
  83. public void setAge(int age) {
  84. this.age = age;
  85. }
  86. private void test(){
  87. System.out.println("私有方法");
  88. }
  89. @Override
  90. public String toString() {
  91. return "User1{" +
  92. "name='" + name + '\'' +
  93. ", id=" + id +
  94. ", age=" + age +
  95. '}';
  96. }
  97. }
  98. /*
  99. 结果:
  100. TestDemo.refection.User1
  101. User1
  102. =========================================
  103. public:public int TestDemo.refection.User1.age
  104. getDeclaredFields:private java.lang.String TestDemo.refection.User1.name
  105. getDeclaredFields:private int TestDemo.refection.User1.id
  106. getDeclaredFields:public int TestDemo.refection.User1.age
  107. =========================================
  108. 获取所有公有的方法,包括父类的:
  109. public java.lang.String TestDemo.refection.User1.toString()
  110. public java.lang.String TestDemo.refection.User1.getName()
  111. public int TestDemo.refection.User1.getId()
  112. public void TestDemo.refection.User1.setName(java.lang.String)
  113. public void TestDemo.refection.User1.setAge(int)
  114. public int TestDemo.refection.User1.getAge()
  115. public void TestDemo.refection.User1.setId(int)
  116. public final void java.lang.Object.wait() throws java.lang.InterruptedException
  117. public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
  118. public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
  119. public boolean java.lang.Object.equals(java.lang.Object)
  120. public native int java.lang.Object.hashCode()
  121. public final native java.lang.Class java.lang.Object.getClass()
  122. public final native void java.lang.Object.notify()
  123. public final native void java.lang.Object.notifyAll()
  124. 获取自己所有的方法,包括私有的:
  125. public java.lang.String TestDemo.refection.User1.toString()
  126. public java.lang.String TestDemo.refection.User1.getName()
  127. public int TestDemo.refection.User1.getId()
  128. public void TestDemo.refection.User1.setName(java.lang.String)
  129. private void TestDemo.refection.User1.test()
  130. public void TestDemo.refection.User1.setAge(int)
  131. public int TestDemo.refection.User1.getAge()
  132. public void TestDemo.refection.User1.setId(int)
  133. 获取指定的公有的方法(包括父类的方法):
  134. public void TestDemo.refection.User1.setName(java.lang.String)
  135. public final native void java.lang.Object.notify()
  136. 获取指定的全部的方法(包括父类的方法,包括私有的方法):
  137. private void TestDemo.refection.User1.test()
  138. =========================================
  139. 获取全部公有(自身的)的构造器:
  140. public TestDemo.refection.User1(java.lang.String,int,int)
  141. public TestDemo.refection.User1()
  142. 获取全部(自身的,包括私有的)的构造器
  143. public TestDemo.refection.User1(java.lang.String,int,int)
  144. private TestDemo.refection.User1(java.lang.String)
  145. public TestDemo.refection.User1()
  146. 获取指定的构造器(不包括私有的):
  147. public TestDemo.refection.User1()
  148. 获取指定的构造器(包括私有的):
  149. private TestDemo.refection.User1(java.lang.String)
  150. */

反射创建对象实例(Constructor)、方法(Method)、属性(Field):

  1. public class Test05 {
  2. public static void main(String[] args) throws Exception {
  3. Class<?> aClass = Class.forName("TestDemo.refection.AAA");
  4. System.out.println("创建一个对象的实例,使用的无参构造器:");
  5. AAA aaa = (AAA)aClass.newInstance();//如果没有无参构造器就会报错
  6. System.out.println(aaa);
  7. System.out.println("创建一个对象的实例,使用的有参构造器:");
  8. AAA aaa1 = (AAA)aClass.getConstructor(int.class, String.class).newInstance(1,"水三丫");
  9. System.out.println(aaa1);
  10. System.out.println("创建一个对象的实例,使用的私有有参构造器:");
  11. Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(int.class);
  12. //需要关闭权限,才可以使用私有的构造器
  13. declaredConstructor.setAccessible(true);
  14. AAA aaa2 = (AAA)declaredConstructor.newInstance(1);
  15. System.out.println(aaa2);
  16. System.out.println("===============================================");
  17. System.out.println("反射使用一个公有方法:");
  18. AAA aaa4 = (AAA)aClass.newInstance();//如果没有无参构造器就会报错
  19. aClass.getMethod("setName", String.class).invoke(aaa4,"水三丫");
  20. System.out.println(aaa4);
  21. System.out.println("反射使用一个公有方法:");
  22. AAA aaa5 = (AAA)aClass.newInstance();//如果没有无参构造器就会报错
  23. Method test = aClass.getDeclaredMethod("test");
  24. test.setAccessible(true);
  25. test.invoke(aaa5);
  26. System.out.println("================================================");
  27. System.out.println("反射获取一个公有属性:");
  28. AAA aaa6 = (AAA)aClass.newInstance();//如果没有无参构造器就会报错
  29. Field field = aClass.getField("name");
  30. field.set(aaa6,"水三丫");
  31. System.out.println(aaa6);
  32. System.out.println("反射获取一个私有属性:");
  33. Field field1 = aClass.getDeclaredField("id");
  34. field1.setAccessible(true);//关闭权限
  35. field1.set(aaa6,1);
  36. System.out.println(aaa6);
  37. }
  38. }
  39. class AAA{
  40. private int id;
  41. public String name;
  42. public AAA() {
  43. }
  44. private AAA(int id) {
  45. this.id = id;
  46. }
  47. public AAA(int id, String name) {
  48. this.id = id;
  49. this.name = name;
  50. }
  51. public int getId() {
  52. return id;
  53. }
  54. public void setId(int id) {
  55. this.id = id;
  56. }
  57. public String getName() {
  58. return name;
  59. }
  60. public void setName(String name) {
  61. this.name = name;
  62. }
  63. private void test(){
  64. System.out.println("我是私有的方法");
  65. }
  66. @Override
  67. public String toString() {
  68. return "AAA{" +
  69. "id=" + id +
  70. ", name='" + name + '\'' +
  71. '}';
  72. }
  73. }
  74. /*
  75. 结果:
  76. 创建一个对象的实例,使用的无参构造器:
  77. AAA{id=0, name='null'}
  78. 创建一个对象的实例,使用的有参构造器:
  79. AAA{id=1, name='水三丫'}
  80. 创建一个对象的实例,使用的私有有参构造器:
  81. AAA{id=1, name='null'}
  82. ===============================================
  83. 反射使用一个公有方法:
  84. AAA{id=0, name='水三丫'}
  85. 反射使用一个公有方法:
  86. 我是私有的方法
  87. ================================================
  88. 反射获取一个公有属性:
  89. AAA{id=0, name='水三丫'}
  90. 反射获取一个私有属性:
  91. AAA{id=1, name='水三丫'}
  92. */

反射获取泛型:

  1. public class Test06 {
  2. public static void main(String[] args) throws Exception {
  3. Class<BB> bbClass = BB.class;
  4. System.out.println("获取参数类型");
  5. Method method = bbClass.getMethod("test01", Map.class, List.class);
  6. //获取类型
  7. Type[] genericParameterTypes = method.getGenericParameterTypes();
  8. for (Type genericParameterType : genericParameterTypes) {
  9. System.out.println(genericParameterType);
  10. //获取单个真实的泛型
  11. if(genericParameterType instanceof ParameterizedType){
  12. Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
  13. for (Type actualTypeArgument : actualTypeArguments) {
  14. System.out.println(actualTypeArgument);
  15. }
  16. }
  17. }
  18. System.out.println("===========================================");
  19. System.out.println("获取返回值类型");
  20. Method test02 = bbClass.getDeclaredMethod("test02", List.class);
  21. Type genericReturnType = test02.getGenericReturnType();
  22. System.out.println(genericReturnType);
  23. if(genericReturnType instanceof ParameterizedType){
  24. Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
  25. for (Type actualTypeArgument : actualTypeArguments) {
  26. System.out.println(actualTypeArgument);
  27. }
  28. }
  29. System.out.println("===========================================");
  30. System.out.println("获取未定型的返回值类型");
  31. Method test03 = bbClass.getDeclaredMethod("test03");
  32. Type genericReturnType1 = test03.getGenericReturnType();
  33. System.out.println(genericReturnType1);
  34. }
  35. }
  36. class BB{
  37. public void test01(Map<String,BB> map, List<BB> list){
  38. System.out.println("test01");
  39. }
  40. public Map<String,BB> test02(List<BB> list){
  41. System.out.println("test01");
  42. return null;
  43. }
  44. public <T>T test03(){
  45. return null;
  46. }
  47. }
  48. /*
  49. 结果:
  50. 获取参数类型
  51. java.util.Map<java.lang.String, TestDemo.refection.BB>
  52. class java.lang.String
  53. class TestDemo.refection.BB
  54. java.util.List<TestDemo.refection.BB>
  55. class TestDemo.refection.BB
  56. ===========================================
  57. 获取返回值类型
  58. java.util.Map<java.lang.String, TestDemo.refection.BB>
  59. class java.lang.String
  60. class TestDemo.refection.BB
  61. ===========================================
  62. 获取未定型的返回值类型
  63. T
  64. */

java反射的初理解的更多相关文章

  1. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  2. Java反射的浅显理解

    一.回顾反射相关的知识 1.在xml文件中使用反射的好处: 1)代码更加灵活,后期维护只需要修改配置文件即可 · 初学者一般习惯于在代码本身上直接修改,后期也可以修改配置文件达到相同的目的 · 修改配 ...

  3. 我对java反射机制的理解

    我们平常怎么用一个使用类,怎么使用类的方法?其实就是创建一个对象,并且通过这个对象调用这个方法.不过这有一个问题,就是这个对象的载体就和这个对象产生了耦合,怎么降低两者间的耦合呢?java的反射机制就 ...

  4. java反射机制的理解

    反射机制是什么概念?大多都有介绍,指的是程序在运行状态中,能够加载一个只有类名的类,加载完之后会在堆上产生一个Class对象.通过这个 Class对象可以获得类的属性.方法和其他类信息.之前对反射的应 ...

  5. Java反射的一些理解

    1.Class对象 VS. 实例对象 在Java中我们一般是这样使用类的:编写类,然后new对象,再调用方法.这里new出来的对象暂且称之为实例对象(instance).其实在这之前还涉及到一个Cla ...

  6. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  7. Java反射机制获取Class文件

    JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...

  8. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  9. (转)JAVA反射机制理解

    JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...

随机推荐

  1. 认识并安装WSL

    认识并安装WSL(基于Windows的Linux子系统) 什么是WSL WSL(Windows Subsystem for Linux),这是在windows平台运行的linux子系统.也就是说可是不 ...

  2. 992. Sort Array By Parity II - LeetCode

    Question 992. Sort Array By Parity II Solution 题目大意:给一个int数组,一半是奇数一半是偶数,分别对偶数数和奇数数排序并要求这个数本身是偶数要放在偶数 ...

  3. Spring 源码(16)Spring Bean的创建过程(7)属性填充

    知识回顾 上一篇介绍了Spring中三级缓存的singletonObjects.earlySingletonObjects.singletonFactories,Spring在处理循环依赖时在实例化后 ...

  4. 好客租房48-组件的props(基本使用)

    组件是封闭的 要接受外部数据应该通过props来实现 props的作用:接受传递给组件的数据 传递数据:给组件标签添加属性 接收数据:函数组件通过参数props接收数据 类组件通过this.props ...

  5. 个人冲刺(四阶段)——体温上报app(一阶段)

    任务:完成了后台数据库的类模块 MyDBHelper.java package com.example.helloworld; import android.content.Context; impo ...

  6. BSP-充电名词解释

    充电名词解释 A~G H~N O~T U~Z A~G ACA = accessory charger adapter = 辅助充电适配器 ACC = apparent charge capacity ...

  7. 《HALCON数字图像处理》第五章笔记

    目录 第五章 图像运算 图像的代数运算 加法运算 图像减法 图像乘法 图像除法 图像逻辑运算(位操作) 图像的几何变换 图像几何变换的一般表达式 仿射变换 投影变换 灰度插值 图像校正 我在Gitee ...

  8. 配置中心的设计-nacos vs apollo

    简介 前面我们分析了携程的 apollo(见 详解apollo的设计与使用),现在再来看看阿里的 nacos. 和 apollo 一样,nacos 也是一款配置中心,同样可以实现配置的集中管理.分环境 ...

  9. JAVA - 线程同步和线程调度的相关方法

    JAVA - 线程同步和线程调度的相关方法 wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁:wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等 ...

  10. 深度学习与CV教程(12) | 目标检测 (两阶段,R-CNN系列)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...