四、通过反射获取运行时类的方法

测试类

package com.liaoxiang.java1;

@MyAnnotation(value="rose")
public class Person extends Creature<String> implements Comparable,MyInterface{
    public String name;
    private Integer age;
    int id;
	//省略getter、settter
    public Person() {
        System.out.println("调用了Person的空参构造器");
    }
    public Person(String name){
        this.name = name;
    }
    private Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
    @Override
    public int compareTo(Object o) {
        return 0;
    }
    @MyAnnotation(value = "jack")
    public void show(){
        System.out.println("我是一个人!");
    }
    private Integer display(String nation, Integer i) throws Exception{
        System.out.println("我的国籍是:"+ nation);
        return i;
    }
    public static void info(){
        System.out.println("静态方法:我是一个中国人");
    }
    // 内部类
    class Bird{}
}

自定义注解:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
}
public class TestMethod {
    /**
     * 获取运行时类的方法
     *          getMethods(): 获取运行时类及其父类中声明为public的方法
     *  getDeclaredMethods(): 获取本类中的声明的所有方法
     */
    @Test
    public void test1(){
        Class<Person> personClass = Person.class;
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("======获取本身类的所有方法=======");
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        输出:
        ======获取本身类的所有方法=======
		public java.lang.String com.liaoxiang.java1.Person.toString()
		public int com.liaoxiang.java1.Person.compareTo(java.lang.Object)
		public java.lang.String com.liaoxiang.java1.Person.getName()
		public int com.liaoxiang.java1.Person.getId()
		public void com.liaoxiang.java1.Person.setName(java.lang.String)
		public void com.liaoxiang.java1.Person.show()
		public static void com.liaoxiang.java1.Person.info()
		private java.lang.Integer com.liaoxiang.java1.Person.display(java.lang.String,java.lang.Integer) throws java.lang.Exception
		public void com.liaoxiang.java1.Person.setAge(java.lang.Integer)
		public void com.liaoxiang.java1.Person.setAge(int)
		public void com.liaoxiang.java1.Person.setId(int)
		public int com.liaoxiang.java1.Person.getAge()
    }
    // 获取注解 权限修饰符 返回值类型 方法名 形参列表 异常
    @Test
    public void test2(){
        Class<Person> personClass = Person.class;
        Method[] declaredMethods = personClass.getDeclaredMethods();

        for (Method declaredMethod : declaredMethods) {
            //1、获取注解
            Annotation[] annotations = declaredMethod.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println("注解:"+annotation);
            }
            //2、获取权限修饰符:getModifiers()
            String string = Modifier.toString(declaredMethod.getModifiers());
            System.out.print("权限修饰符:"+string+" ");
            //3、返回值类型:getReturnType()
            Class<?> returnType = declaredMethod.getReturnType();
            System.out.print("返回值类型:"+returnType.getName()+" ");
            //4、方法名
            System.out.print("方法名:"+declaredMethod.getName()+" ");
            //5、形参列表
            System.out.print("(");
            Class<?>[] parameterTypes = declaredMethod.getParameterTypes();
            for (int i = 0; i < parameterTypes.length; i++) {
                System.out.print("形参列表:"+parameterTypes[i].getName() + "args-"+i+" ");
            }
            System.out.print(")");
            //6、异常
            Class<?>[] exceptionTypes = declaredMethod.getExceptionTypes();
            if (exceptionTypes.length != 0){
                System.out.print(" throws ");
            }
            for (int i = 0; i < exceptionTypes.length; i++) {
                System.out.print("异常:"+exceptionTypes[i].getName()+" ");
            }
            System.out.println();
        }
	权限修饰符:public 返回值类型:java.lang.String 方法名:toString ()
	权限修饰符:public 返回值类型:int 方法名:compareTo (形参列表:java.lang.Objectargs-0 )
	权限修饰符:public 返回值类型:java.lang.String 方法名:getName ()
	权限修饰符:public 返回值类型:int 方法名:getId ()
	权限修饰符:public 返回值类型:void 方法名:setName (形参列表:java.lang.Stringargs-0 )
	权限修饰符:private 返回值类型:java.lang.Integer 方法名:display (形参列表:java.lang.Stringargs-0 形参列表:java.lang.Integerargs-1 ) throws 异常:java.lang.Exception 
	注解:@com.liaoxiang.java1.MyAnnotation(value=jack)
	权限修饰符:public 返回值类型:void 方法名:show ()
	权限修饰符:public static 返回值类型:void 方法名:info ()
	权限修饰符:public 返回值类型:int 方法名:getAge ()
	权限修饰符:public 返回值类型:void 方法名:setAge (形参列表:java.lang.Integerargs-0 )
	权限修饰符:public 返回值类型:void 方法名:setAge (形参列表:intargs-0 )
	权限修饰符:public 返回值类型:void 方法名:setId (形参列表:intargs-0 )
    }
    /**
     * 调用运行时类指定的方法,Object invoke(Object obj, Object ... obj)
     *      invoke 方法的返回值就是获取的具体方法的返回值
     */
    @Test
    public void test3() throws Exception{
        Class<Person> personClass = Person.class;
        // 调用普通方法,无返回值
        Method method1 = personClass.getMethod("show");
        Person p = personClass.newInstance();
        method1.invoke(p);
        // 调用普通方法,有返回值
        Method method2 = personClass.getMethod("toString");
        Object result = method2.invoke(p);
        System.out.println(result);
        // 调用静态方法
        Method method3 = personClass.getMethod("info");
        method3.invoke(Person.class);
        // 获取运行时类的所有声明的方法
        Method method4 = personClass.getDeclaredMethod("display", String.class, Integer.class);
        method4.setAccessible(true);
        Object value = method4.invoke(p, "中国", 10);
        System.out.println(value);
    }
    调用了Person的空参构造器
	我是一个人!
	Person{name='null', age=null, id=0}
	静态方法:我是一个中国人
	我的国籍是:中国
	10
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值