要想获得private类型的变量可见Field例1.参见:TestGetFields.java例3:获取类的方法举例public class A {
public String a1="a1";
private String a2="a2";
public void methodA1(){
}
private void methodA2(){
}
}
public class B extends A {
public String b1="b1";
private String b2="b2";
public void methodB1(){
}
private void methodB2(){
}
}通过getDeclaredMethods(),获取当前类所有方法Class> c = Class.forName("A");
Method[] array_method = c.getDeclaredMethods();
for(int i=0;iSystem.out.println(array_method[i].toString());结果public void A.methodA1()
private void A.methodA2()通过getMethods(),获取当前类所有方法(包括父类)
c = Class.forName("A");
array_method = c.getDeclaredMethods();
for(int i=0;iSystem.out.println(array_method[i].toString());结果public void A.methodA1()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException通过指定的函数名,获取方法(不带参数)c = Class.forName("B");
Class[] argsClass = new Class[]{};
Method m = c.getMethod("methodB1", argsClass );或Method m = c.getMethod("methodB1", new Class[]{});
System.out.println(m.toString());结果public void B.methodB1()通过指定的函数名,获取方法(带基本类型参数)c = Class.forName("B");
Class[] parameterTypes = new Class[] { int.class, int.class };
Method myMethod = c.getMethod("add", parameterTypes);
System.out.println(myMethod.toString());结果public int B.add(int,int)通过指定的函数名,获取方法(参数为数组)c = Class.forName("B");
parameterTypes = new Class[] {int[].class};
myMethod = c.getMethod("testArray", parameterTypes);
System.out.println(myMethod.toString());结果public int B.testArray(int[])参见:TestGetMothed.java例4:获取构造函数Class> c = Class.forName("A");
Constructor[] constructors = c.getConstructors();
for(int i=0;iSystem.out.println(constructors[i].toString());结果public A()
public A(java.lang.String)参见:TestConstructor.java
4.Field类gettype():class:获得该属性的类型。getname():string:获得属性名称。isaccessible():boolean:判断该属性是否是可以访问的,通常私有和保护的类型都是不可以访问的。get(object obj):object:获得实例obj的属性值,如果这个属性是非公有的,这里会报IllegalAcces***ception。set(objectobj,objectvalue):设置该实例的属性值setAccessible(booleanflag):设置该属性是否可以访问,如果你调用get和set方法,那么有可能会引发访问权限的错误,这个时候你可以调用setaccessible方法使得该属性可以访问。例1:将private属性a2设置为可访问,并修改其值A a=new A();
Field f=A.class.getDeclaredField("a2");
f.setAccessible(true);
System.out.println(f.get(a));
f.set(a,"123456");
System.out.println(f.get(a));结果a2
123456参见:TestField.java
5.Method类getname():string:获得方法的名字。getreturntype():class:获得方法的返回值类型。getparametertypes():class[]:获得方法的参数类型。isaccessible():boolean:判断该方法是否是可以访问的。setaccessible(booleanflag):设置该方法是否可以访问。getexceptiontypes():class[]:获得该方法可能抛出的异常类类型。invoke(objectobj,object...args):object:调用实例obj的相应方法,其参数由args给定,如果没有参数那么可以什么都不写。例1:通过invoke调用指定的函数public int add(int param1, int param2)
{
return param1 + param2;
}
Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class });
Object result = addMethod.invoke(invokeTester, new Object[] { new Integer(100), new Integer(200) });
System.out.println((Integer) result);参见:InvokeTester.java