1.Java在运行期就可以知道对象所属的类,可以构造任意类的对象,判断任意对象的属性方法,可以在运行期调用任意对象的方法。
2.动态语言:开发者社区认为:程序运行时允许改变程序结构或变量类型,这种语言成为动态语言,c++,java,c#不是动态,java虽不是动态语言、但却有Reflection,“反射。映像、倒影”
Java可以加载一个在运行时才可以知道名称的class,获悉其完整构造,并生成对象等的能力被称为introspection(“内省、內观、反省”)与反射式两个并提的术语
3不管java中一个类有多少个对象、但这些对象只对应于同一个Class对象。
4.首先获得class对象(三种1.Demo.class2.forName(com.test.Demo)3. getClass()方法),用newInstance获得class对象的实例classType,classType调用getmethod()方法获得方法实例addMethod,
addMethod调用invoke方法传值获得方法调用。
Class<?>classType=InvokeTester.class;
ObjectinvokeTester=classType.newInstance();
Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class});
Object result=addMethod.invoke(invokeTester,new Object[]{1,2});
一个类对应一个class对象,一个方法对应一个method对象。
可变参数一定是最后一个。所以一个方法最多一个可变参数。
5.要想使用反射,必须先
6.若想通过类的不带参数的构造方法来生成对象。两种方法:
a)先获得class对象,通过该对象的newInstance()方法
Class<?> clazz=String.class;
Objectobj=clazz.newInstance();
b)先获得class对象,然后通过对应的Constructor对象,再通过该Constructor随想的newInstance()方法生成
Class<?> clazz=Customer.class;
Constructorcons=clazz.getConstructor(new Class[]{});
Objectobj=cons.newinstance(new Object[]{});
Java.lang.Array类:
7.Integer.Type与Integer.Class/前者返回原生类型int、后者是返回真正的类。
Method.setAccessible(true);可以用来压制java默认的格式,使反射机制可以调用私有方法。