Java反射机制Reflection
Reflection(反射)是Java被视为准动态语言的关键,反射机制允许程序在执行期间借助ReflectionAPI去的任何类的内部信息(无视private等),并能够直接操作任意对象的内部属性及方法
Class c = Class.forName("java.lang.String");
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射
正常方式:引入需要的“包类”名称—>通过new实例化—>取得实例对象
反射方式:实例化对象—>getClass()方法—>得到完整的“包类”名称
- Java反射(Reflection)框架主要提供以下功能:
-
在运行时判断任意一个对象所属的类;
-
在运行时构造任意一个类的对象;
-
在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
-
在运行时调用任意一个对象的方法
- Java反射(Reflection)的主要用途
-
工厂模式:Factory类中用反射的话,添加了一个新的类之后,就不需要再修改工厂类Factory了
-
数据库JDBC中通过Class.forName(Driver).来获得数据库连接驱动
-
分析类文件:毕竟能得到类中的方法等等
-
访问一些不能访问的变量或属性:破解别人代码
- Java反射(Reflection)的基本运用
获取Class有一下三种方法:
- 使用Class类的forName静态方法
//在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
//这通过java.lang.Class类的静态方法forName(String className)实现。
//例如:
try{
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
//System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}
//成功加载后,会将Driver类的实例注册到DriverManager类中。
- 直接获取某一个对象的class
Class<?> klass = int.class;
Class<?> classInt = Integer.TYPE;
- 调用某个对象的getClass()方法
public class Test{
public static void main(String[] args) {
Demo demo=new Demo();
System.out.println(demo.getClass().getName());
}
}
扫描二维码,在手机上阅读!
评论