反射操作方法和构造方法

获取构造方法
Constructor con = clazz.getConstructor(Class…参数类型);
clazz.getDeclaredConstructor();
clazz.getDeclaredConstructors();
Constructor类中的常用方法
con.getModifiers();
con.getName();
con.getParameterTypes(); // 参数类型
con.getExceptionTypes(); // 异常类型
操作构造方法,执行创建对象
Object obj = con.newInstance(执行构造方法时所需要的参数);
con.setAccessible(true);

主方法:

package com.csdn.study;

import java.lang.reflect.Field;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
    public static void main(String[] args){
        try {
            Class clazz = Person.class;  // 找Person对应的class
            Constructor con = clazz.getConstructor();// 找寻clazz中的无参构造方法
            Constructor con2 = clazz.getConstructor(String.class); // 找寻clazz中的带String参数构造方法
            // 执行
            Person person =(Person)con.newInstance();
            Field field = clazz.getDeclaredField("name");
            field.setAccessible(true);
            field.set(person,"张三");
            System.out.println(person); // 张三
            System.out.println(con.getModifiers()); // 1
            System.out.println(con.getName()); // com.csdn.study.Person
            System.out.println(con.getParameterTypes()); // [Ljava.lang.Class;@74a14482
            System.out.println(con.getExceptionTypes()); // [Ljava.lang.Class;@1540e19d
        }catch(NoSuchMethodException e){
            e.printStackTrace();
        }catch(InstantiationException e){
            e.printStackTrace();
        }catch(IllegalAccessException e){
            e.printStackTrace();
        }catch(InvocationTargetException e){
            e.printStackTrace();
        }catch(NoSuchFieldException e){
            e.printStackTrace();
        }

    }
}

Person类:

package com.csdn.study;

public class Person extends Animal{
    private String name;
    public Person(){}
    public Person(String name){
        this.name = name;
    }
    public String toString(){
        return this.name;
    }
}

输出结果:

张三
1
com.csdn.study.Person
[Ljava.lang.Class;@74a14482
[Ljava.lang.Class;@1540e19d

获取私有的构造方法
主方法:

package com.csdn.study;

import java.lang.reflect.Field;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
    public static void main(String[] args){
        try {
            // 如果构造方法是私有的
            Class clazz = Person.class;
            Constructor con = clazz.getDeclaredConstructor(); // 获取私有的构造方法
            con.setAccessible(true); // 设置为可操作的
            Person person = (Person)con.newInstance(); // 创建对象
            Field field = clazz.getDeclaredField("name"); // 获取属性
            field.setAccessible(true); // 设置为可操作
            field.set(person,"李四"); // 操作属性
            System.out.println(person); // 输出李四
        }catch(NoSuchMethodException e){
            e.printStackTrace();
        }catch(InstantiationException e){
            e.printStackTrace();
        }catch(IllegalAccessException e){
            e.printStackTrace();
        }catch(InvocationTargetException e){
            e.printStackTrace();
        }catch(NoSuchFieldException e){
            e.printStackTrace();
        }

    }
}

Person类只是把两个构造方法改成private而已,其他没变

操作类中的方法
Class类中的方法

Method method = clazz.getMethod("方法名“,Class...参数类型); // 可以获取本类和父类的(私有)
Method[] methods = clazz.getMethods(); // 获取所有公有的方法,本类和父类的
Method method = clazz.getDeclaredMethod(); // 获取私有的方法,只能本类的
Method[] methods = clazz.getDeclaredMethods(); // 获取所有的私有方法
Method类中常用的方法
int m = method.getModifiers();
Class mreturn = method.getReturnType(); // 获取返回值的数据类型
String name = method.getName(); // 获取方法的名字
Class[] mpts = method.getParemeterTypes(); // 获取参数列表所有参数的类型
Class[] mets = method.getExceptionTypes(); // 获取方法抛出的异常类型

操作方法,执行方法
Object result = invoke(对象,执行方法需要的参数);如果方法本身没有返回值,则返回null
主方法:

package com.csdn.study;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
    public static void main(String[] args){
        try {
            Class clazz = Person.class;
            Constructor con = clazz.getConstructor(String.class);
            Person person = (Person)con.newInstance("张三");
            Method method = clazz.getMethod("eat");
            Object returnResult = method.invoke(person); // 执行方法,输出了Person中 public void eat(){}
            System.out.println(returnResult); // 输出null
            Method method2 = clazz.getMethod("eat",String.class); // 获取带String参数的方法
            Object returnResult2 = method2.invoke(person,"吃饭");// 执行方法,输出:Person中 public void eat(String str){}
            System.out.println(returnResult2); // 输出 吃饭,因为有返回值
        }catch(NoSuchMethodException e){
            e.printStackTrace();
        }catch(InstantiationException e){
            e.printStackTrace();
        }catch(IllegalAccessException e){
            e.printStackTrace();
        }catch(InvocationTargetException e){
            e.printStackTrace();
        }

    }
}

Person类:

package com.csdn.study;

public class Person extends Animal{
    private String name;
    public Person(){}
    public Person(String name){
        this.name = name;
    }
    public void eat(){
        System.out.println("Person中 public void eat(){}");
    }
    public String eat(String str){
        System.out.println("Person中 public void eat(String str){}");
        return str;
    }
    public String toString(){
        return this.name;
    }
}

获取私有方法就不展示了,都是一样的。还有获取所有的公有方法,所有的私有方法,也不演示了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值