宁波网站推广公司报价,微信网页版本,做网站 被谷歌收录,做一个微信公众号需要多少钱分析方法四要素
我们先来看一下#xff0c;不使用反射机制调用一个方法需要几个要素的参与。
有一个这样的类#xff1a;
package com.powernode.reflect;/*** author 动力节点* version 1.0* className SystemService* since 1.0**/
public class SystemService {public voi…分析方法四要素我们先来看一下不使用反射机制调用一个方法需要几个要素的参与。有一个这样的类packagecom.powernode.reflect;/** * author 动力节点 * version 1.0 * className SystemService * since 1.0 **/publicclassSystemService{publicvoidlogout(){System.out.println(退出系统);}publicbooleanlogin(Stringusername,Stringpassword){if(admin.equals(username)admin123.equals(password)){returntrue;}returnfalse;}}编写程序调用方法packagecom.powernode.reflect;/** * author 动力节点 * version 1.0 * className ReflectTest01 * since 1.0 **/publicclassReflectTest01{publicstaticvoidmain(String[]args){// 创建对象SystemServicesystemServicenewSystemService();// 调用方法并接收方法的返回值booleansuccesssystemService.login(admin,admin123);System.out.println(success?登录成功:登录失败);}}通过以上第16行代码可以看出调用一个方法一般涉及到4个要素调用哪个对象的systemService哪个方法login传什么参数“admin”, “admin123”返回什么值success获取Method要使用反射机制调用一个方法首先你要获取到这个方法。在反射机制中Method实例代表的是一个方法。那么怎么获取Method实例呢有这样一个类packagecom.powernode.reflect;/** * author 动力节点 * version 1.0 * className SystemService * since 1.0 **/publicclassSystemService{publicvoidlogout(){System.out.println(退出系统);}publicbooleanlogin(Stringusername,Stringpassword){if(admin.equals(username)admin123.equals(password)){returntrue;}returnfalse;}publicbooleanlogin(Stringpassword){if(110.equals(password)){returntrue;}returnfalse;}}我们如何获取到 logout()、login(String,String)、login(String) 这三个方法呢要获取方法Method首先你需要获取这个类Class。ClassclazzClass.forName(com.powernode.reflect.SystemService);当拿到Class之后调用getDeclaredMethod()方法可以获取到方法。假如你要获取这个方法login(String username, String password)MethodloginMethodclazz.getDeclaredMethod(login,String.class,String.class);假如你要获取到这个方法login(String password)MethodloginMethodclazz.getDeclaredMethod(login,String.class);获取一个方法需要告诉Java程序你要获取的方法的名字是什么这个方法上每个形参的类型是什么。这样Java程序才能给你拿到对应的方法。这样的设计也非常合理因为在同一个类当中方法是支持重载的也就是说方法名可以一样但参数列表一定是不一样的所以获取一个方法需要提供方法名以及每个形参的类型。假设有这样一个方法publicvoidsetAge(intage){this.ageage;}你要获取这个方法的话代码应该这样写MethodsetAgeMethodclazz.getDeclaredMethod(setAge,int.class);其中setAge是方法名int.class是形参的类型。如果要获取上面的logout方法代码应该这样写MethodlogoutMethodclazz.getDeclaredMethod(logout);因为这个方法形式参数的个数是0个。所以只需要提供方法名就行了。你学会了吗调用Method要让一个方法调用的话就关联到四要素了调用哪个对象的哪个方法传什么参数返回什么值packagecom.powernode.reflect;/** * author 动力节点 * version 1.0 * className SystemService * since 1.0 **/publicclassSystemService{publicvoidlogout(){System.out.println(退出系统);}publicbooleanlogin(Stringusername,Stringpassword){if(admin.equals(username)admin123.equals(password)){returntrue;}returnfalse;}publicbooleanlogin(Stringpassword){if(110.equals(password)){returntrue;}returnfalse;}}假如我们要调用的方法是login(String, String)第一步创建对象四要素之首调用哪个对象的ClassclazzClass.forName(com.powernode.reflect.SystemService);Objectobjclazz.newInstance();//过时方法第二步获取方法login(String,String)四要素之一哪个方法MethodloginMethodclazz.getDeclaredMethod(login,String.class,String.class);第三步调用方法ObjectretValueloginMethod.invoke(obj,admin,admin123);解说四要素哪个对象obj哪个方法loginMethod传什么参数“admin”, “admin123”返回什么值retValuepackagecom.powernode.reflect;importjava.lang.reflect.Method;/** * author 动力节点 * version 1.0 * className ReflectTest02 * since 1.0 **/publicclassReflectTest02{publicstaticvoidmain(String[]args)throwsException{ClassclazzClass.forName(com.powernode.reflect.SystemService);Objectobjclazz.newInstance();MethodloginMethodclazz.getDeclaredMethod(login,String.class,String.class);ObjectretValueloginMethod.invoke(obj,admin,admin123);System.out.println(retValue);}}那如果调用既没有参数又没有返回值的logout方法应该怎么做packagecom.powernode.reflect;importjava.lang.reflect.Method;/** * author 动力节点 * version 1.0 * className ReflectTest03 * since 1.0 **/publicclassReflectTest03{publicstaticvoidmain(String[]args)throwsException{ClassclazzClass.forName(com.powernode.reflect.SystemService);Objectobjclazz.newInstance();MethodlogoutMethodclazz.getDeclaredMethod(logout);logoutMethod.invoke(obj);}}假设你知道属性名假设有这样一个类packagecom.powernode.reflect;/** * author 动力节点 * version 1.0 * className User * since 1.0 **/publicclassUser{privateStringname;privateintage;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.ageage;}OverridepublicStringtoString(){returnUser{namename\, ageage};}}你知道以下这几条信息类名是com.powernode.reflect.User该类中有String类型的name属性和int类型的age属性。另外你也知道该类的设计符合javabean规范。也就是说属性私有化对外提供setter和getter方法你如何通过反射机制给User对象的name属性赋值zhangsan给age属性赋值20岁。packagecom.powernode.reflect;importjava.lang.reflect.Method;/** * author 动力节点 * version 1.0 * className UserTest * since 1.0 **/publicclassUserTest{publicstaticvoidmain(String[]args)throwsException{// 已知类名StringclassNamecom.powernode.reflect.User;// 已知属性名StringpropertyNameage;// 通过反射机制给User对象的age属性赋值20岁Class?clazzClass.forName(className);Objectobjclazz.newInstance();// 创建对象// 根据属性名获取setter方法名StringsetMethodNamesetpropertyName.toUpperCase().charAt(0)propertyName.substring(1);// 获取MethodMethodsetMethodclazz.getDeclaredMethod(setMethodName,int.class);// 调用MethodsetMethod.invoke(obj,20);System.out.println(obj);}}执行结果给User的name属性赋值zhangsan这个大家可以尝试自己完成哦