摘要:主要用到反射机制,和这些类。动态调用的方法其中,为类的对象,为要被调用的方法名得到对象得到对象中名为的不带参数的方法。
public void function(String str) { //根据 str的值 调用相应的方法 } public void test() { //code }
如str的值为test,就调用test方法。主要用到java反射机制,Class和Method这些类。
动态调用的方法:a.getClass().getMethod(str, new Class[]{}).invoke(a, new Object[]{})
其中,a为类的对象,str为要被调用的方法名
a.getClass()得到a.class对象
getMethod(str, new Class[]{})得到a对象中名为str的不带参数的方法。如果str方法带参数如str(String s, int i),就要这样写getMethod(str, new Class[]{String.class,int.class})
invoke(a,new Object[]{})调用方法,第一个参数是要调用这个方法的对象,如果方法是static的,这个参数可以为null。如果调用有参数的方法str(String s, int i),应该这样写invoke(a,new Object[]{"jimmy", 1})
下面是代码,帮助理解
public class MovingInvokeTest { private static MovingInvokeTest movingInvokeTest = new MovingInvokeTest(); // 创建MovingInvokeTest对象 /* * 根据str字符串调用方法,变量i只是为了判断,调用有几个参数的方法 */ public void do_test(String str, int i) throws Exception { if (i == 0) { // 调用没有参数的方法 movingInvokeTest.getClass().getMethod(str, new Class[] {}).invoke(movingInvokeTest, new Object[] {}); } else if (i == 1) { // 调用有一个参数的方法,参数为String类型的s movingInvokeTest.getClass().getMethod(str, new Class[] { String.class }).invoke(movingInvokeTest, new Object[] { "s" }); } else if (i == 2) { // 调用有两个参数的方法 参数分别为String类型的qw和int型的1 movingInvokeTest.getClass().getMethod(str, new Class[] { String.class, int.class }).invoke(movingInvokeTest, new Object[] { "qw", 1 }); } } public void speak() { System.out.println("调用的没有参数的方法"); } public void speak(String s) { System.out.println("调用有一个参数的方法,参数为:" + s); } public void speak(String s, int i) { System.out.println("调用有两个参数的方法,参数为,参数为:" + s + "和" + i); } public static void main(String[] args) throws Exception { movingInvokeTest.do_test("speak", 1); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64122.html
摘要:这种语法,在中被称为动态代理。在动态代理机制中,这个角色只能是接口。动态代理就是实现的技术之一。 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的__call。这种语法除了能更好的实现动态代理外,还是RPC框架实现原理的一部分。 动态代理...
摘要:要明白,动态代理类的存在意义是为了拦截方法并修改逻辑而动态代理的局限性之一就是只能拦截接口所声明的方法。因为动态代理类是继承自业务类,所以该类和方法不能声明成无法继承或重写。者最终都是生成了一个新的动态代理类对象。 动态代理 1、先谈静态代理 对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实...
摘要:静态方法生成动态代理类同样需要通过类装载器来进行装载才能使用,它与普通类的唯一区别就是其字节码是由在运行时动态生成的而非预存在于任何一个文件中。 代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。showImg(https://segmentfault...
摘要:代理模式代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。 代理模式: 代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。应用场景一般是需要在执行某个已经写好的方法前后再添加一段逻辑,比如执行方法前打印日志,或者在执行方法之前和之后打时...
摘要:动态地代理,可以猜测一下它的含义,在运行时动态地对某些东西代理,代理它做了其他事情。所以动态代理的内容重点就是这个。所以下一篇我们来细致了解下的到底是怎么使用动态代理的。 之前讲了《零基础带你看Spring源码——IOC控制反转》,本来打算下一篇讲讲Srping的AOP的,但是其中会涉及到Java的动态代理,所以先单独一篇来了解下Java的动态代理到底是什么,Java是怎么实现它的。 ...
摘要:的动态性反射机制动态编译动态执行代码动态字节码操作动态语言程序运行时可以改变程序得结构或变量类型典型语言等如下代码不是动态语言但有一定的动态性我们可以利用反射机制字节码操作获得类似动态语言的特性的动态性让编程的时候更加灵活反射机制反射机制指 1.Java的动态性 反射机制 动态编译 动态执行JavaScript代码 动态字节码操作 2.动态语言 程序运行时,可以改变程序得结构或变量...
阅读 2589·2021-11-12 10:36
阅读 2220·2021-08-23 09:47
阅读 1643·2019-08-30 15:44
阅读 1376·2019-08-30 14:10
阅读 2222·2019-08-29 16:52
阅读 2310·2019-08-29 16:40
阅读 1527·2019-08-29 16:17
阅读 2376·2019-08-26 13:21