因为看android source code的缘故, 里面用到了很多java的reflection机制,所以恶补了一下java知识
主要是学习了constructor , Class object etc.
顺手写了一些测试用代码, 贴出来供学习
import java.lang.reflect.*;
import java.lang.*;
public class Program
{
class InnerClass{
public int i = 0;
class MostInnerClass {
}
}
public Program() {
}
public Program(String str){
this.str = str;
System.out.println("Hello, Ctor with String param used");
}
private Program(String str, Integer i){
this.str = str;
this.i = i;
System.out.println("Hello, Ctor with String & int param used");
}
public void getName() {
System.out.println("--->" + this.str);
}
private String str = "Hello";
private Integer i = 1;
public static void main(String[] args) {
try {
Program program = new Program();
Class progClass = Program.class;
Class[] ctorArgs1 = new Class[1];
ctorArgs1[0] = String.class;
Constructor strCtor = progClass.getConstructor(ctorArgs1);
System.out.println("Constructor found :" + strCtor.toString());
Object[] initArgs = new Object[1];
initArgs[0] = "Test";
Object newIns = strCtor.newInstance(initArgs);
Method method = progClass.getDeclaredMethod("getName");
method.invoke(newIns);
System.out.println(" " + newIns.getClass());
System.out.println("................................");
System.out.println(InnerClass.MostInnerClass.class.getDeclaringClass() +" ");
Class[] ctorArgs2 = new Class[2];
ctorArgs2[0] = String.class;
ctorArgs2[1] = Integer.class;
Constructor strintCtor = progClass.getConstructor(ctorArgs2);
System.out.println("Constructor found :" + strintCtor.toString());
}
catch(Exception ex) {
System.out.println("Constructor doesn't exist or is " +
"not public: " + ex.toString());
}
}
}
运行结果
Constructor found :public Program(java.lang.String)
Hello, Ctor with String param used
--->Test
class Program
................................
class Program$InnerClass
Constructor doesn't exist or is not public: java.lang.NoSuchMethodException: Program.<init>(java.lang.String, java.lang.Integer)
最后要说明的是getDeclaringClass, 它返回的是调用该函数的类所在的类,或者说是Class object的外层类, 这里得到 class Program$InnerClass