java反射 long_JAVA反射

要想获得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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值