Java反射之剖析构造函数

反射通俗理解
  (根据字符串)解析出一个类的各个组成部分(构造函数,字段,方法)。
  主要用来做框架

以下是一个简单的测试类

首先是一个测试实体,在此为一个Person类。类里面有五个构造函数。里面的构造有两种类型的:

  1、公开的

  2、私有的

其中每种类型又包含无参数的,和有参数的(一个或多个)

然后是一个测试类,主要测试了上面所说的几种类型组合的构造函数的获取,以及创建对象并输出测试代码。测试是用Junit来测试的。

**** 反射创建对象时,有两种方式。

  关于第一种方式,获取私有构造函数需要getDeclaredConstructor()来获取,创建实例前,通过setAccessible(true)强制设置为可在类外执行

  关于第二种方式,通过类创建则必须要保证类中要一个无参数的构建函数

     1、获取到构造函数,通过构造函数创建实例(对象)

     2、加载类之后,直接通过类创建实例

Person.java:

 1 package cn.rt.gwq;
 2
 3 import java.util.List;
 4
 5 public class Person {
 6
 7     public String value = "public  value";
 8
 9     /**
10      *无参数构造函数
11      */
12     public Person() {
13         System.out.println("no params constructor");
14     }
15
16     /**
17      * 一个参数的构造函数
18      * @param name
19      */
20     public Person(String name) {
21         System.out.println("string name constructor");
22         value = "change the value : "+name;
23     }
24
25     /**
26      * 一个参数的构造函数
27      * @param age
28      */
29     public Person(int age) {
30         System.out.println("int age constructor");
31         value = "change the value : "+age;
32     }
33
34     /**
35      * 多个参数的构造函数
36      * @param usm
37      * @param pwd
38      */
39     public Person(String usm,String pwd) {
40         System.out.println("String usm,String pwd constructor");
41         value = "change the value : "+usm +":"+pwd;
42     }
43
44     /**
45      * 私有的构造函数
46      * @param list
47      */
48     private Person(List list) {
49         System.out.println("List constructor");
50         value = "change the value : "+list.toArray().toString();
51     }
52
53 }

Person.java

Demo.java:reflect

  1 package cn.rt.gwq;
  2
  3 import java.lang.reflect.Constructor;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6
  7 import org.junit.Test;
  8
  9 public class Demo {
 10
 11     /**
 12      * 获取无参数构造函数并创建对象
 13      * @throws Exception
 14      */
 15     @Test
 16     public void test1() throws Exception{
 17
 18         //加载类
 19         Class clazz1 = Class.forName("cn.rt.gwq.Person");
 20         //获取构造函数
 21         Constructor c = clazz1.getConstructor(null);
 22         //根据构造函数创建对象
 23         Person p = (Person)c.newInstance(null);
 24         //验证
 25         System.out.println(p.value);
 26
 27         return;
 28
 29     }
 30
 31     /**
 32      * 获取有参数的构造函数并创建对象
 33      * @throws Exception
 34      */
 35     @Test
 36     public void test2() throws Exception {
 37
 38         Class clazz2 = Class.forName("cn.rt.gwq.Person");
 39         Constructor c = clazz2.getConstructor(String.class);
 40         Person p = (Person) c.newInstance("bob");
 41         System.out.println(p.value);
 42
 43         return;
 44     }
 45
 46     /***
 47      * 获取多个参数的构造函数并创建对象
 48      * @throws Exception
 49      */
 50     @Test
 51     public void test3() throws Exception{
 52
 53         Class clazz3 = Class.forName("cn.rt.gwq.Person");
 54         Constructor c = clazz3.getConstructor(String.class,String.class);
 55         Person p = (Person) c.newInstance("username","password");
 56         System.out.println(p.value);
 57
 58         return ;
 59     }
 60
 61     /**
 62      * 获取私有的构造函数并且创建对象
 63      * @throws Exception
 64      */
 65     @Test
 66     public void test4() throws Exception{
 67
 68         //加载类
 69         Class clazz3 = Class.forName("cn.rt.gwq.Person");
 70         //获取构造函数
 71         //Constructor c = clazz3.getConstructor(List.class);
 72         //需要用带Declared的方法来读取私有方法
 73         Constructor c = clazz3.getDeclaredConstructor(List.class);
 74         //强制可读0
 75         c.setAccessible(true);
 76         //参数
 77         List list = new ArrayList<>();
 78         list.add(1);list.add(2);
 79         //创建对象
 80         Person p = (Person) c.newInstance(list);
 81         //验证
 82         System.out.println(p.value);
 83
 84         return;
 85
 86     }
 87
 88     /***
 89      * 不通过构造函数,直接通过类来创建对象
 90      * 前提:必须有一个无参数的构造函数
 91      * @throws Exception
 92      */
 93     @Test
 94     public void test5() throws Exception {
 95
 96         Class clazz = Class.forName("cn.rt.gwq.Person");
 97         Person p = (Person) clazz.newInstance();
 98         System.out.println(p.value);
 99
100     }
101
102
103 }

Demo.java

  

时间: 2024-10-24 00:10:00

Java反射之剖析构造函数的相关文章

Java反射机制剖析(四)-深度剖析动态代理原理及总结

动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Proxy0)的源代码和整个动态代理的流程. $Proxy0生成的代码如下: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; impo

Java反射机制剖析(三)-简单谈谈动态代理

通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来控制对这个对象的访问.其实代理模式是在访问的对象时引入一定程度的间接性,这种间接性可以附加多种用途. 它 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 存在关联关系,一个代理类的对象与一个委托类的对象

java反射机制剖析(三)—类类型Class

为了区别于我们常用的Class,因此给了个中文名类类型.目的就是为了知道此Class非彼Class.上一篇博客已经介绍了Class Loader,它的作用是根据提供的信息来加载类到内存中.我之前有提过这个类信息的提供者就是本篇博客要介绍的Class.提醒:一个类的Class对象和它的Instance是不一样的,切记,不然你会混乱的.开始了! 概念 Class类是所有类(注意是对象)的共有信息的抽象,比如该类实现的接口.对应的加载器.类名等等.一句话,类类型保存了每个类所对应的类型信息.每一个类都

【54】Java反射机制剖析

java反射机制: 1.指的是可以于运行时加载,探知和使用编译期间完全未知的类. 2.程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性; 3.加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射. 4.每个类被加载进入内存之后,系统

java反射机制剖析(二)— Class Loader

上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是其中之一.本篇博客就详细的对ClassLoader做一个相对深入的了解.作为了解需要知道的是,其实类类型(Class Class)是和ClassLoader分不开的,因为ClassLoader需要的信息是由它提供的.类类型将在下一篇博客介绍. 简介 ClassLoader是负责加载类的对象,作用是根据Jvm请求提供的类信息,将请求的类加载的内存中或者说加载到Jvm中.另外,每一个类的Class对象(注意

Java反射之剖析方法

继上篇反射构造函数后,今剖析函数方法. 要通过反射执行方法: 1.可以先反射出类或构造函数,创建实例对象,通过对象调用方法(反射通过构造函数创建对象参见上篇). 2.可以通过类反射出方法,传入关联对象,从而实现对象调用方法. 以下是一个简单测试类: 包含两个文件: 1.Person.java,用于反射操作 2.Deom:Demo_MtdRft.java,反射的测试代码 测试的情况包括:1.公有方法,2.私有方法,3.无参数方法,4.有参数方法,5静态方法 下面是两个测试代码文件: Person.

Java反射之剖析main方法

上篇反射了类的成员方法,main方法其实也应该包含在其中,因为main方法就是一个静态方法. 但实际mian的反射稍有不同,其原因主要是为在升级过程中保持1.5兼容1.4版本:推理如下 1.main方法的参数为一个类型为String[]的参数 2.1.5支持可变参数,所以是可以可变参数形式来读取参数的, 如:main(String[]{"arg1","arg2"})===> main("arg1","arg2") 3.但

Java反射之剖析字段

通过反射获取字段: -- 反射方法并调用时,静态方法可以不传递对象. 字段有点小不同,即使是静态字段也需要传递对象 以下是测试类:包括一个测试实体类:Girl.java,一个反射测试Demo.java Girl.java: 1 package cn.rt.gwq; 2 3 public class Girl { 4 5 private int age = 18; 6 public int height = 168; 7 public static String name = "alice&quo

java反射机制剖析(一)—简介

由之前动态代理的学习再次接触到反射这个知识点,第二次接触了所以做了一些稍微深入的了解.那么,对于反射这部分的内容我打算分三篇博客来总结.本篇博客先对反射做一个大概的了解,包括反射有关的RTTI.定义的理解以及涉及到的其他知识的简介. 回顾 java之前我接触反射这个知识,是在大话设计中的抽象工厂模式里,通过反射+配置文件来优化抽象工厂提高其应对需求变更的灵活性.当时对于反射的认知仅仅是它是一种技术,一种实例化对象的技术,一种实例化对象不依赖于写死的代码的技术.简单的说就是,它是一种可以摆脱用NE