昨天帮同事看问题的时候碰到的, 简要描述一下实现.
需求:
Java下反射获取Interface, 实例化它并同时实现其中的方法.
实现:
反射一个类好说, 从类名拿到Class再newInstance一把就有, 方法什么的, 也是Method.invoke一下就行.
但是反射一个Interface, 以前没碰到过, 同事听别人说要用代理实现, 于是百度后试了一把, 果然可以.
反射这个Interface:
package com.test.util; public interface TestInterface { public int getInt(); }
1. 先要拿到ClassLoader和Interface(以com.test.util.TestInterface为例), 后者不需要实例化, 当然也不能够实例化:
ClassLoader loader = InterfaceProxy.class.getClassLoader(); Class interfazz = loader.loadClass("com.test.util.TestInterface");
2. 然后就是通过Proxy拿到Interface实例, 同时实现其中的方法:
Object clazzInstance = Proxy.newProxyInstance(loader, new Class[] { interfazz }, new InvocationHandler() { @Override public Object invoke(Object obj, Method method, Object[] args) throws Throwable { if (method.getName().equals("getInt")) { return 1234; } else { return method.invoke(obj, args); } } });
3. 拿到了实例, 就能调用了, 调用的时候当然是通过反射:
Method method = clazzInstance.getClass().getMethod("getInt", new Class[] {}); System.out.println("getInt = " + (int) method.invoke(clazzInstance, new Class[] {}));
4. 可以看到输出的log是:
getInt = 1234
需求的逻辑就这样通了~~~~~
======================== 纯纯的分隔线 ========================
这部分还能扩展一下, 注意Proxy.newProxyInstance方法的第二个参数. 该参数是一个Class数组, 即具备"实例化一个实现了多个Interface的匿名类"的能力. 在实现多个Interface后, 可以在invoke方法下根据方法名 & 参数来实现指定的方法.
另外, 这里面还有一个值得注意的地方, 就是实现这些Interface时, 不需要实现所有方法, 因此在实现类下未实现的方法被调用时, 会crash.
相关推荐
很好的Java面试题第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...
注: 静态内部类(Inner Class)意味着1创建一个static内部类 的对象,不需要一个外部类对 象,2 不能从一个static内部类的一个对象访问一个外部类对象 4、&和&&的区别 答:&是位运算符,表示按位与运算,&&是...
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...
匿名内部类 Anonymous Inner Type 没有名字的类!!! 代码示例如下 /* * 匿名内部类演示 */ interface A { void test(); } /** * 非abstract修饰TypeA遵从接口A,要求强制实现接口A中的test方法 * @author ...
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...
2、针对接口编程,而不要针对实现类编程 54 3、多用组合,少用继承(包含实现) 54 4、为了交互对象之间的松耦合设计而努力 54 5、类应该对扩展开放,对修改关闭 54 6、依赖倒置,要依赖抽象,不要依赖具体类 54 36 ...
28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String是最基本的数据类型吗? 22 31、String s = ...
Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。可以继承抽象(SDK1.5没有限制),但一个内部类可以作为一个...
28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 23 29、super.getClass()方法调用 23 30、String是最基本的数据类型吗? 24 31、String s = "Hello...
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同, 第四,&和&&的...
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...
28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String是最基本的数据类型吗? 22 31、String s = "Hello...
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口) 答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,...