扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
import java.lang.reflect.InvocationTargetException;
创新互联专业为企业提供太原网站建设、太原做网站、太原网站设计、太原网站制作等企业网站建设、网页设计与制作、太原企业网站模板建站服务,十多年太原做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ApplicationRunner {
public void run(final String canonicalName){
try {
final Class type = Class.forName(canonicalName);
final Object classHost = type.newInstance();
for(final Method method : type.getDeclaredMethods()){
if(isRunnableMethod(method)){
method.invoke(classHost);
}
}
} catch (final ClassNotFoundException e) {
e.printStackTrace();
} catch (final InstantiationException e) {
e.printStackTrace();
} catch (final IllegalAccessException e) {
e.printStackTrace();
} catch (final InvocationTargetException e) {
e.printStackTrace();
}
}
private boolean isRunnableMethod(final Method method){
return method.getAnnotation(Test.class) != null
Modifier.isPublic(method.getModifiers())
method.getParameterTypes().length == 0
method.getReturnType().equals(void.class);
}
public static void main(String[] args) {
new ApplicationRunner().run(TestHost.class.getCanonicalName());
}
}
你可以试试我的方法. 而且我建议你直接传对象进去解析类.这样会容易很多
java的反射用法:(异常请自行处理)
①找到类:Class cl = Class.forName("java.util.Date");
②创建对象(要求这个类中含有空参数的构造方法):Object obj = cl.newInstence();
③根据名称和参数找方法:Method method1 = cl.getMethod("getTime");//如果没有参数不用写第二个参数如果有参数的如:Method method2 = cl.getMethod("setTime",long.class);
④在某个对象上面执行方法,Object result = method1.invoke(obj);//如果有参数的Object result = method2.invoke(obj,21317362721);
执行的方如果有返回值,将返回值返回,否则返回null
java开发工程师岗位职责:
1、负责公司网站开发和维护;
2、负责对网站进行实施,测试;
3、负责现有网站的维护和升级;
4、负责解决开发过程中的技术问题;
5、负责网站开发文档编写工作;
6、统一代码风格、监督团队开发、落实测试、验收代码质量;
7、参与软件系统设计,能编写代码。
里面的注释已经很清楚了。
首先用Class.forName去取到Class对象,java中Class、Method都是一种对象(相对其它对象要特殊一点,因为它们代表类的结构),Class中包含Method数组,也就是Class的方法,这里getDeclaredMethods()取到所有方法对象到数组method中,然后用for循环打印每一个方法toString信息。
给你一个小的实例代码:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
public class test {
public static void main(String args[]) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("这个一个Foo对象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新设置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}
class Foo {
private String msg;
public Foo(String msg) {
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void outInfo() {
System.out.println("这是测试Java反射的测试类");
}
}
1.就是说根据你传进去的对象类型返回相应的代理。这个不是在静态编译时决定的, 而是运行时决定的,所以叫做动态。this指的是当前InvocationHandler对象,也就是new MyInvocationHandler()出来的。
2.执行RealSubject中的say方法,因为这个时候实际的对象是bind(new RealSubject())。
3.没有调用自己啊。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流