Java的反射(一)
反射多用于 JDBC 中的加载驱动程序 Class.forName("com.mysql.jdbc.Driver");Struts 的 MVC、Hibernate 中的 ORM、Spring 中的 IOC 还有一些其他框架等等。那它有什么好处呢?它的好处就是能够动态的创建对象和编译且能够访问某个类中的所有(包括私有)属性方法及对象的属性方法并进行调用,比较灵活,这样也有利于降低类间的耦合度;但反射也有缺点,就是破坏了类的封装性和对象的完整性。
一、Class 类:
1、对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class类型的对象。一个 Class 对象包含了特定某个类的有关信息。
2、Class 对象只能由系统建立对象
3、一个类在 JVM 中只会有一个 Class 实例,每个类的实例都会记得自己是由哪个 Class 实例所生成
4、获取 Class 对象的方式:
2、Class 对象只能由系统建立对象
3、一个类在 JVM 中只会有一个 Class 实例,每个类的实例都会记得自己是由哪个 Class 实例所生成
4、获取 Class 对象的方式:
Class c1=null;
(1)通过类的 class 属性获取,这种方法最可靠、程序性能更高
类名.class
c1=Person.class;
类名.class
c1=Person.class;
(2)通过对象调用
getClass()方法获取
Object obj=new Person();
c1=obj.getClass();
(3)通过全类名来获取(用的较多)
Object obj=new Person();
c1=obj.getClass();
(3)通过全类名来获取(用的较多)
String className=“com.info.Person”;
c1=Class.forName(className);
c1=Class.forName(className);
5、Class 类的常用方法:
static Class forName(String name)
返回指定类名 name 的 Class 对象
Object newInstance() 调用缺省构造函数,返回该 Class 对象的一个实例
Object newInstance(Object []args) 调用当前格式构造函数,返回该 Class 对象的一个 实例
getName() 返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称
Class getSuperClass() 返回当前 Class 对象的父类的 Class 对象
Class [] getInterfaces() 获取当前 Class 对象的接口
ClassLoader getClassLoader() 返回该类的类加载器
Class getSuperclass() 返回表示此 Class 所表示的实体的超类的 Class
Object newInstance() 调用缺省构造函数,返回该 Class 对象的一个实例
Object newInstance(Object []args) 调用当前格式构造函数,返回该 Class 对象的一个 实例
getName() 返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称
Class getSuperClass() 返回当前 Class 对象的父类的 Class 对象
Class [] getInterfaces() 获取当前 Class 对象的接口
ClassLoader getClassLoader() 返回该类的类加载器
Class getSuperclass() 返回表示此 Class 所表示的实体的超类的 Class
示例:
Object
newInstance()方法的使用:
Class c2=null;
c2=Class.forName("com.info.Person");
Object obj=c2.newInstance();//调用类的无参的构造器
System.out.println(obj);
【注意】在定义类时一定要 声明 无参的构造器, 给反射使用
Class c2=null;
c2=Class.forName("com.info.Person");
Object obj=c2.newInstance();//调用类的无参的构造器
System.out.println(obj);
【注意】在定义类时一定要 声明 无参的构造器, 给反射使用
二、 ClassLoader
类加载器是用来把类 (class) 装载进 JVM 的。 JVM 规范定义了两种类型的类 加 载器:启动类加载器 (bootstrap) 和用户自定义加载器 (user- - defined class loader) 。JVM 在运行时会产生 3 3 个类加载器组成的初始化加载器层次结构 ,如下图所示:
类加载器是用来把类 (class) 装载进 JVM 的。 JVM 规范定义了两种类型的类 加 载器:启动类加载器 (bootstrap) 和用户自定义加载器 (user- - defined class loader) 。JVM 在运行时会产生 3 3 个类加载器组成的初始化加载器层次结构 ,如下图所示:
示例:
1、获取一个系统的类加载器
ClassLoader loader=ClassLoader.getSystemClassLoader();
System.out.println(loader);
2、获取系统类加载器的父类加载器
loader=loader.getParent();
System.out.println(loader);
3、测试当前类是由哪个类加载器加载的:
loader=Class.forName("com.info.TestClass").getClassLoader();
System.out.println(loader);
Reflection (反射)是Java 被视
为动态语言的关键,反射机制允许程序在执行期借
助于Reflection API 取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java
反射机制主要提供了以下功能:
(1)在运行时构造任意一个类的对象
(2)在运行时获取任意一个类所具有的成员变量和方法
(3)在运行时调用任意一个对象的方法(属性)
(4)生成动态代理
(1)在运行时构造任意一个类的对象
(2)在运行时获取任意一个类所具有的成员变量和方法
(3)在运行时调用任意一个对象的方法(属性)
(4)生成动态代理