更新时间:2019-08-15 10:50:31 来源:极悦 浏览1922次
一、Java反射拿到调用对象的方法
1、通过Class.forName(“包名+方法的类名”)拿到方法的对象;
如:Class clazz = Class.forName("ReflectionTest");
也可以通过实例,获取方法的对象类,
如:String str = "test , reflection";
Class clazz = str.getClass();
2、明确反射方法名称 ;
3、明确方法的参数类型,就可以拿到对象的方法。
如:Method method = clazz.getMethod("test",String.class,int.class);
二、接着就是invoke()调用方法了:
1、实例化对象,可以直接调用已创建的对象,也可以newInstance()一个。
2、确定具体方法的参数
如: Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
System.out.println("直接反射:"+obj1);
三、补充一些关于Java反射的知识:
Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。
如: Clazz.getName()获取类的完整名字
getPackage()获取此类所属的包
getSuperclass() 获取父类对应的Class对象
getFiled(String name) 获得类的指定成员变量
getMethods() 获得类的public类型的方法
getMethod(String name, Class[] args) 获取类的指定方法
四、具体实例:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionTest {
public String test(String name ,int age) {
return name+",今年"+age+"岁,是一个极富好奇心地乐观青年!";
}
public static void main(String args[]) {
String str = "test , reflection";
int len1 = str.length();
System.out.println("直接调用length() :"+len1);
//反射String.length()方法
//直接填入调用该方法的对象str,这里不需要newInstance()
Object len2 = Reflection(str,str.getClass(),"length",null,null);
System.out.println("java 反射调用length() :"+len2);
Class clazz;
try {
//调用自己创建的函数,
//反射得到类 包名+类名,我这边没有包名就直接是 "ReflectionTest"
clazz = Class.forName("ReflectionTest");
//直接java反射得到方法
Method method= clazz.getMethod("test",String.class,int.class);
Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
System.out.println("直接反射:"+obj1);
//创建函数完成反射
//创建参数class 类型的数组
Class cla[] = {String.class,int.class};
Object obj = Reflection(clazz.newInstance(),clazz,"test",cla,"小君",22);
System.out.println("创建函数完成反射: "+obj);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 通过反射执行cclass的方法
* @param object ---调到该方法的具体对象
* @param cclass ---具体对象的class类型
* @param paramClasses ---反射方法中参数class类型
* @param methodName ---反射方法的名称
* @param args ----调用该方法用到的具体参数
*
*
* */
public static Object Reflection(Object object ,Class cclass,String methodName,Class[] paramclasses, Object... args) {
try {
Method method = cclass.getMethod(methodName,paramclasses);
return method.invoke(object,args);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
/* 运行结果:
直接调用length() :17
java 反射调用length() :17
直接反射:xiaojun,今年23岁,是一个极富好奇心地乐观青年!
创建函数完成反射: 小君,今年22岁,是一个极富好奇心地乐观青年!*/
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习