42-咸鱼学Java-详解反射中的Class对象

Class中的方法

MethodName作用
getName()获得类的完整路径
getDeclaredFields()获得类的所有属性(包括私有成员变量)
getDeclaredMethods()获得类的所有方法
getConstructors()得到构造函数
newInstance()获得对象
getClassLoader()获得其类加载器

示例代码

class Test{
    private String Testname ;
    public Test() {
        System.out.println("Test 空构造方法");
    }
    public Test(String name)
    {
        this.Testname = name;
        System.out.println("Test name参数构造方法");
    }
    public String getTestname() {
        return Testname;
    }
    public void setTestname(String testname) {
        Testname = testname;
    }
    public void fun1()
    {
        System.out.println("fun1 函数");
    }
}

先通过

        Class cla = Test.class;

获得Class对象。

getName()

        String name = cla.getName();
        System.out.println(name);

结果Test

getDeclaredFields()

        Field[] declaredFields = cla.getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field.getName()); //获得成员变量名,并打印
        }

结果Testname

Field类

常用方法有

MethodName作用
get(Object obj)返回指定对象上此 Field 表示的字段的值。
getType()返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
getName()返回此 Field 对象表示的字段的名称。
set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
setAccessible(boolean a)设置可见性,当设置为true的时候可以访问修改私有属性

实例

        //获得Testname字段的Filed对象
        Field field= cla.getDeclaredField("Testname");
        //获得其类型
        Class Type = field.getType();
        //获得其类型名字
        String typeName = Type.getName();
        //打印类型名
        System.out.println("Testname type: "+typeName);
        //设置可见性
        field.setAccessible(true);
        //新建对象
        Test a = new Test("myname");
        //获得a对象的Testname字段的值
        String name = (String) field.get(a);
        //打印
        System.out.println("通过反射取到的Testname: "+name);
        System.out.println("通过成员方法get到的Testname: "+a.getTestname());
        //修改名称
        field.set(a, "newname");
        System.out.println("修改后通过成员方法get到的Testname: "+a.getTestname());

结果
Testname type: java.lang.String
Test name有参构造方法
通过反射取到的Testname: myname
通过成员方法get到的Testname: myname
修改后通过成员方法get到的Testname: newname

getDeclaredMethods()

        //获得全部方法
        Method[] declaredMethods = cla.getDeclaredMethods();
        for (Method method : declaredMethods) {
            //获得方法名
            String methodname = method.getName();
            System.out.println(methodname);
        }

结果
fun1
setTestname
getTestname

Method类

MethodName作用
getName()返回方法名称
getTypeParameters()获得参数的Class数组
getReturnType()获得返回值的Class
getModifiers()以整数形式返回此Method对象所表示方法的 Java 语言修饰符(表见下表)
invoke(Object obj, Object… args)调用方法
修饰符数字二进制
public10000 0000 0001
private20000 0000 0010
protected40000 0000 0100
static80000 0000 1000
final160000 0001 0000
synchronized320000 0010 0000
volatile640000 0100 0000
transient1280000 1000 0000
native2560001 0000 0000
interface5120010 0000 0000
abstract10240100 0000 0000
strict20481000 0000 0000

实例

        //获得全部方法
        Method[] declaredMethods = cla.getDeclaredMethods();
        for (Method method : declaredMethods) {
            //获得方法名
            String methodname = method.getName();
            //打印方法名
            System.out.println(methodname);
            //获得参数列表
            Class<?>[] parameterTypes = method.getParameterTypes();
            //遍历
            System.out.print("参数列表为:   ");
            for (Class<?> class1 : parameterTypes) {
                System.out.print(class1.getName()+" ");
            }
            //获得返回值
            Class<?> returnType = method.getReturnType();
            System.out.println("\n返回值为:"+returnType.getName());

            //获得方法修饰
            int modifiers = method.getModifiers();
            System.out.println("方法修饰号为:"+modifiers);

            System.out.println("===========================");
        }

        Test a = new Test("TestDemo");
        //先获取getTestname方法  此方法两个参数一个是方法名 一个是参数的Class类
        Method getTestname = cla.getDeclaredMethod("getTestname",null);
        //通过invoke调用getTestname方法,invoke可以参数为可变参数,因为无参数,则不传入参数
        String Testname = (String) getTestname.invoke(a);
        System.out.println("通过invoke调用get:   "+Testname);

        //获取setTestname 因为 参数为String则需要传进去String.class
        Method setTestname = cla.getDeclaredMethod("setTestname",String.class);
        //通过invoke调用 传入name字符串
        setTestname.invoke(a, "myNewName");
        //打印名字
        System.out.println("通过invoke调用set(myNewName):     "+a.getTestname());

结果
fun1
参数列表为:
返回值为:void
方法修饰号为:1
===========================
setTestname
参数列表为: java.lang.String
返回值为:void
方法修饰号为:1
===========================
getTestname
参数列表为:
返回值为:java.lang.String
方法修饰号为:1
===========================
Test name有参构造方法
通过invoke调用get: TestDemo
通过invoke调用set(myNewName): myNewName

getConstructors()

        //获得构造函数列表
        Constructor[] constructors = cla.getConstructors();
        //遍历
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName());
        }

结果
Test
Test

Constructor类

MethodName作用
getName()返回构造方法名称
getTypeParameters()获得参数的Class数组
newInstance(Object… initargs)调用相应的构造函数构造对象

实例

        //获得构造函数列表
        Constructor[] constructors = cla.getConstructors();
        //遍历
        for (Constructor constructor : constructors) {
            System.out.println("构造方法名:"+constructor.getName());
            //获得参数列表
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            //遍历
            System.out.print("参数列表为:   ");
            for (Class<?> class1 : parameterTypes) {
                System.out.print(class1.getName()+" ");
            }
            System.out.println("\n===========================");
        }
        //获得无参数构造函数
        Constructor noParameterConstructor=cla.getConstructor();
        //执行
        Test noParameterTest = (Test) noParameterConstructor.newInstance();
        //获得有参数的构造方法
        Constructor ParameterConstructor=cla.getConstructor(String.class);
        //执行
        Test ParameterTest = (Test) ParameterConstructor.newInstance("sss");

结果
构造方法名:Test
参数列表为: java.lang.String
===========================
构造方法名:Test
参数列表为:
===========================
Test 空构造方法
Test name有参构造方法

newInstance()

Test newInstance = (Test) cla.newInstance();

结果Test 空构造方法
可以看出此方法只能调用空的构造函数来new对象,所以我们在写有关于反射的框架的时候,都会给每个类放置一个空的构造函数,防止在反射获取对象的时候获取不到。

getClassLoader()

        ClassLoader classLoader = cla.getClassLoader();
        System.out.println(classLoader);

结果sun.misc.Launcher$AppClassLoader@1a7508a
可以看出它是由AppClassLoader所进行加载的,所以可以通过此方法查看类是由那个加载器加载的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值