Java反射机制
一,反射是什么鬼:
动态语言:程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言
java的反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的任意一个方法和属性;
java具有一定的动态特性,但还不是动态语言,改不了程序结构或变量类型
二,反射机制的作用:
1,反编译:.class-->.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
3.动态加载类(无需全编译程序即可更新部分功能),这里来个示例:效果是在不重新编译Main的情况下,添加一个类,调用这个类的方法!
先思考如下方式:
1 public class Test { 2 3 public static void main(String[] args) { 4 if("Word".equals(args[0])){ 5 new Word().start(); 6 } 7 if(...) 8 } 9 10 }
这就写死了,如果要调用PPT类的start()方法,必须要再添加判断PPT的代码,并且要重新编译整个程序!!
同时可以看出:通过new方式创建对象,是静态加载的,即在编译的时候,必须确保所有可能用到的类都已存在!
下面,通过反射的方式,可以动态加载!
1 public class Test { 2 3 public static void main(String[] args) { 4 try { 5 Class c = Class.forName(args[0]); 6 TestInterface t = (TestInterface) c.newInstance(); 7 t.start(); 8 } catch (Exception e) { 9 e.printStackTrace(); 10 } 11 } 12 } 13 14 interface TestInterface { 15 public abstract void start(); 16 } 17 18 class Word implements TestInterface { 19 20 @Override 21 public void start() { 22 System.out.println("Word is starting"); 23 } 24 }
此时编译Test.java 再java Test Word,执行是没有任何问题的
在此基础上,新建一个PPT类,实现TestInterface
1 public class PPT implements TestInterface { 2 3 @Override 4 public void start() { 5 System.out.println("PPT is starting"); 6 } 7 }
只编译这一个PPT.java 即javac PPT.java 此时再执行 java Test PPT,同样可以正常执行
这就实现了动态加载类
三,反射涉及到的类:
java.lang.Class;
Object类是最高级领导,它有个方法getClass():用于获取类的类类型!!每个类有且只有一个类类型!!
类类型可以干嘛? 答:获取类的方法属性,创建对象,调用对象方法属性这些都要靠类类型,获取到类类型是第一步工作!!!
获取类类型的三种方式:
//第一种方式: Class c1 = Class.forName("A"); //第二种方式: Class c2 = A.class; //第三种方式: Class c3 = new A().getClass();
四、获取方法信息