开发者学堂课程【Java 高级编程:反射调用普通方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/20/detail/382
反射调用普通方法
内容简介:
一、获取全部方法
二、自定义方法信息展示
三、在不导入指定类开发包的情况下实现属性的配置
一、获取全部方法
在进行反射处理的时候,也可以通过反射来获取类之中的全部方法,但是需要提醒的是,如果要想通过反射调用这些方法,必须有一个前提条件类之中要提供有实例化对象。
在 class 类里面提供有如下的操作,可以获取方法对象:
1. 获取全部方法;
public Method[] getMethods()throws SecurityException
2. 获取指定方法;
public Method getMethod(String name,
Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
3. 获取本类全部方法;
public Method[] getDeclaredMethods()
throws SecurityException
4. 获取本类指定方法;
public Method getDeclaredMethod(String name,
Class<?>.. parameterTypes)
Throws NoSuchMethodException,
SecurityException
范例:获取全部方法
package cn.mldn.demo;
import java.lang.reflect.Method;
import cn.mldn.vo.Person;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
C1ass<?>cls = Person.class;//获限指定类的q1ass对象
//获取全部方法《包括父类中的方法)
Method methods []=cls.getMethods();
for (Method met : methods){
System.out.println(met);
//获取本类方法
Method methods [] = cls.getDeclaredMethods() ;l
for (Method met:methods)(
System.out.println(met);
注意加入分割线
二、自定义方法信息展示
在构造方法时难以发现两者的区别,于是举这个例子。但是需要注意的是,这个时候的方法信息的获取是依靠 method 类提供的 tostring() 方法完成的。
在很多时候,也可以由用户自己来拼凑方法信息的展凑形式。打开 system. 会把所有方法信息摆出来,但是这个信息不可能按照他默认的方法来展示,于是可以自定义方法信息显示。
范例:自定义方法信息西显示
Met 中有一个方法叫 getname,在方法名称前,应该有返回值类型和修饰符;该修饰符是整型;参考 Modifier 类,Modifier 中常量都是整型,刚才输出的是对应的内容,但是如果想还原,能够看懂的是 public,可以通过方法 tostring 来实现。
修饰符完成之后,需要追加方法返回类型。拥有返回值类型后加上 getname 之后方法名称就需要加括号。括号还需要考虑 get parameterTypes 得到参数类型。
之后每个参数参与for循环,继续加入控制,执行代码后方法出现。信息反射完成,得到方法名称。
这种代码只需要清楚可以根据反射获取方法的结构即可,不需要做过多的深入理解,但是在 method 类里面有一个致命的重要方法:
Public Ob ject invoke(ob ject ob j, Ob ject... args) throws
I11egal AccesException,I11egal ArgumentException,
InvocationTargeException
后续所有操作都是通过此方法展开的。Object 描述的是实力对象,这是反射调用类中的方法。
在 person 类里面,为 name 属性追加有 setter 与 getter 方法。
public class Person extends AbstractBase implements IMessageService,IChannelService {
private String name
private int age ;
public Person(){}
public Person(String name,int age) (
this.name = name ;
this.age = age;
public void setName(String name)(this.name ▪ name;
public String getName(){
return name;}
随后需要通过反射机制来实现 person 类之中的 setter 与 getter 方法的调用处理。
可以通过 class for name 识别化,通过此方法识别的优点就是不用导入。
三、在不导入指定类开发包的情况下实现属性的配置
范例:在不导入指定类开发包的情况下实现属性的配置
所以代码需要按照如下思考
1.任何情况下,如果要想保存类中的属性或者调用类中的方法,都必须保证存在有实例化对象,居然不允许导入包,那么就反射实例化。
2.如果要想进行方法的调用,那么一定要获取方法的名称。Attribute 是 string 类型,用于获取指定的方法。Setname 为方法名称。Invoke 要传递参数,接收实例化对象。
String setMethodName w "setName“//方法名
Method setMethod= cls-getDeclaredMethod(setMethodName,String-class); // 期所E的方法
setMethod.invoke(obj,value);
String getMethodName = "getName";
Method getMethod = cls.getDeclaredMethod(getMethodName);
System.out.print1n(getMethod.invoke(obj));
代码执行能够反射调用。
利用此类操作,整体的操作形式不会有任何的明确的类对象产生,一切都是依靠反射机制处理的,这样的处理避免了与一个类的耦合问题。这种方法在某一个复杂的类处理上较为方便。