反射详解 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
- 反射详解 I
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解
- 反射详解!
- 反射详解
- i++与++i详解
- java反射机制详解!
- java 反射机制详解
- 消息反射详解
- 详解C#中的反射
- JAVA反射详解
- 大学英语六级听力——016(American and European cultural courses)
- 一次Android游戏黑屏闪退问题的分析
- Smack:调试Smack
- [CSS3学习]画出一个扇形
- PHP高效率写法(详解原因)
- 反射详解 I
- 耐压,成熟
- 为什么String类是不可变的
- java.sql.SQLException: Unknown type '246 in column 0 of 1 in binary-encoded result set的解决办法
- 一些常用函数
- imageView src图片自适应
- 哈夫曼编码
- java的System.getProperty()方法可以获取的值
- 如何:在十六进制字符串与数值类型之间转换(C# 编程指南MSDN)