已知道接口 TestInf (定义方法 t1), 已知道实现类 TestImpl(含方法 t1 ,t2) ,现根据方法名称,通过类反射来调用其中的方法。两个类型都是动态获取的。
要求只能调用TestInf中含有的方法。现在是通过判断方法名称如果在TestInf中没有就 报错。
说简单点就 是实现静态代码:
TestInf test = new TestImpl();
请教如何实现?
附加说明: 不是描述注入之类的,就是想动态实例化对象,但要转成一个接口,接口是暴露给第三方系统使用,所以接口中的方法个数会少于对象的方法个数。由于涉及很多个服务,所以要通过类反射来调用。
不太明白你的意思,今天学了spring,感觉你表达的意思和spring中的注入机制类似。仅供参考
使用动态代理实现
接口A 实现类B
使用动态代理创建的对象中只能使用接口A中定义的方法。在调用方法时,会通过反射调用实现类B
示例:
public interface Subject {
public void rent();
public void hello(String str);
}
public class RealSubject implements Subject {
@Override
public void rent() {
System.out.println("I want to rent my house");
}
@Override
public void hello(String str) {
System.out.println("hello: " + str);
}
}
动态代理类
public class DynamicProxy implements InvocationHandler {
private Object subject;
public DynamicProxy(Object subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
Object rs = method.invoke(subject, args);
return rs;
}
}
调用
Subject realSubject = new RealSubject();
InvocationHandler handler = new DynamicProxy(realSubject);
Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);
subject.rent();
subject.hello("123");