java反射 数组类型_java反射

1、如何描述方法-Method(getDeclaredMethod()不能获取父类方法   getMethod() 一般只能获取私有方法)

@Testpublic void testMethod() throwsClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{

Class clazz=Class.forName("reflect.Person");//1、获取clazz对应类中的所有方法--方法数组1

Method[] methods=clazz.getMethods();for(Method method:methods){

System.out.println(method.getName());

}

System.out.println("-----------------------------------------------------");//2、获取所有方法包括私有方法---方法数组2

methods=clazz.getDeclaredMethods();for(Method method:methods){

System.out.println(method.getName());

}//3.1、获取指定的方法//需要参数名称和参数列表,无参则不需要//对于方法 public void setName(String name){}

Method method=clazz.getDeclaredMethod("setName",String.class);

System.out.println(method);//而对于方法public void setAge(int age){}

method=clazz.getDeclaredMethod("setAge",int.class);

System.out.println(method);

method=clazz.getDeclaredMethod("setSal",Integer.class);

System.out.println(method);//4、执行方法 invoke() 第一个参数表示执行哪个对象的方法,剩下的参数是执行方法时需要转入的参数

Object obj=clazz.newInstance();

method.invoke(obj,2000);//如果一个方法是私有方法,3.1是可以获取到的,但是这一步却不能执行//私有方法的执行,必须在调用invoke之前加上一句method.setAccessible(true)

method=clazz.getDeclaredMethod("Say",null);

method.setAccessible(true);

method.invoke(obj,null);

}

主要用到的两个方法

/***@paramname the name of the method

*@paramparameterTypes the list of parameters

*@returnthe {@codeMethod} object that matches the specified*/

public Method getMethod(String name, Class>... parameterTypes){

}/***@paramobj the object the underlying method is invoked from

*@paramargs the arguments used for the method call

*@returnthe result of dispatching the method represented by*/

publicObject invoke(Object obj, Object... args){

}

自定义工具方法

自定义一个方法

把类对象和类方法名作为参数,执行方法

把全类名和方法名作为参数,执行方法

假设:Person类里面有一个方法

public voidtest(String name,Integer sal){

System.out.println("调用成功");

}

1. 把类对象和类方法名作为参数,执行方法(下面的方法没有考虑到无参的方法)

/***@paramobj: 方法执行的那个对象.

*@parammethodName: 类的一个方法的方法名. 该方法也可能是私有方法.

*@paramargs: 调用该方法需要传入的参数

*@return: 调用方法后的返回值

* 把类对象和类方法名作为参数,执行方法*/

public Object invoke(Object obj,String methodName,Object ... args) throwsException{//1、获取Method对象//因为getMethod的参数为Class类型,所以要把参数args转换为对应的Class类型

Class[] parameterTypes=newClass[args.length];for(int i=0;i

parameterTypes[i]=args[i].getClass();

System.out.println(parameterTypes[i]);

}

Method method=obj.getClass().getDeclaredMethod(methodName, parameterTypes);//如果使用getDeclaredMethod(),就不能获取父类方法,如果使用getMethod()就不能获取私有方法//2、执行Method方法//返回方法返回值

returnmethod.invoke(obj, args);

}

@Testpublic void testInvoke() throwsException{

Object obj=newPerson();

invoke(obj,"test","李刚",20000);

}

2.把全类名和方法名作为参数,执行方法(没有考考虑无参的方法)

publicObject invoke(String className,String methodName,Object...args){

Object obj=null;try{

obj=Class.forName(className).newInstance();returninvoke(obj,methodName,args);

}catch(Exception e){

e.printStackTrace();

}return null;

}

这种反射实现的主要功能是可配置和低耦合。只需要类名和方法名,而不需要一个类对象就可以执行一个方法。如果我们把全类名和方法名放在一个配置文件中,就可以根据调用配置文件来执行方法

如何获取父类定义的(私有)方法

前面说一般使用getDeclaredMethod获取方法(因为此方法可以获取类的私有方法,但是不能获取父类方法)

如何获取父类方法呢,getMethod

首先我们要知道,如何获取类的父亲:

比如有一个类,继承自Person

@Testpublic void testGetSuperClass() throwsException{

String className="reflect.Student";

Class clazz=Class.forName(className);

Class superClazz=clazz.getSuperclass();

System.out.println(superClazz);//class reflect.Person

}

此时如果Student中有一个方法是私有方法method1(int age); Person中有一个私有方法method2();

怎么调用 定义一个方法,不但能访问当前类的私有方法,还要能父类的私有方法

111111111111111111111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值