反射详解 I

来源:互联网 发布:零度网络 编辑:程序博客网 时间:2024/06/05 10:02

一、JAVA反射机制的基本知识点

1、JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法

2、对于任意一个对象,都能够调用它的任意一个方法和属性

3、这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 

4、 动态获取类中信息,就是java反射; 可以理解为对类的解剖

二: Class对象的获取方式

1、一个Class的实例对象代表着一份内存中字节码,就是系统加载其他类到内存中时调用的那一份字节码;

    获取某个类或某个对象所对应的Class对象的常用的3种方式: 

       (1)某个类的实例对象getClass();如String s = “aa”; Class<?> clazz = s.getClass(); 

       (2)Class.forName("该类的完整名称");如:Class.forName("java.lang.String")

       (3)类名.class;如:String.class

   当使用forName()方法时若此类已经被加载过,则直接返回此类的字节码映射;若还没有加载过,则虚拟机会加载这个类到内存中,然后将其字节码的映射地址返回

实体类代码:

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;System.out.println(this.name + ":" + this.age);}public Student() {System.out.println("Student is demo");}}

2、一个类无论有多少个对象,他们的Class对象同一个,也就是对应同一份字节码文件

public static void main(String[] args) {Student s = new Student();Class clazz = s.getClass();Student s2 = new Student();Class clazz2 = s2.getClass();System.out.println(clazz == clazz2);}

输出结果为:true

很好的验证了:一个类的所有Class对象都是同一个,都对应同一份字节码文件

三:反射获取构造方法

Constructor类:代表了一个类中的一个构造方法

1、有无参构造函数的对象的创建

Class clazz = Class.forName("cn.itcast.bean.Student");Object obj = clazz.newInstance();

其中通过Class的newInstance()方法建立类对象,改方法调用的是Class类对象所属类默认空参构造函数

2没有无参构造函数的对象的创建

Class clazz = Class.forName("cn.itcast.bean.Student");Constructor cs = clazz.getConstructor(String.class,int.class);Object obj = cs.newInstance("Student",20);

Class类对象3种方法可以获取Constructor类对象

[1].  Class类的getConstructors()方法(获取某个类所有公共的构造函数)

[2].  Class类的getDeclaredConstructors()方法(获取某个类所有申明的构造函数)

[3].  Class类的 getConstructor(Class<?>...parameterTypes)方法(获取某个类指定的公共构造函数)

为了说明上面方式的不同,将其中Student类的一个构造方法私有化

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;System.out.println(this.name + ":" + this.age);}private Student() {System.out.println("Student is demo");}}

测试代码:

1、getConstructors()方法

Class clazz = Class.forName("com.jtt.demo.Student");Constructor[] cons = clazz.getConstructors();for (Constructor con : cons) {System.out.println(con);}

输出结果:public com.jtt.demo.Student(java.lang.String,int)

其中:只显示出了公共的有参数构造函数,没有显示出私有的公共函数

2、getDeclaredConstructors()方法

Class clazz = Class.forName("com.jtt.demo.Student");Constructor[] cons = clazz.getDeclaredConstructors();for (Constructor con : cons) {System.out.println(con);}

输出结果:

publiccom.jtt.demo.Student(java.lang.String,int)

private com.jtt.demo.Student()

显示出了所有申明构造函数

3、 Class类的 getConstructor(Class<?>...parameterTypes)方法

Class clazz = Class.forName("com.jtt.demo.Student");Constructor con = clazz.getConstructor(String.class, int.class);Object obj = con.newInstance("lisi", 20);

输出结果:lisi:20

原创粉丝点击