java反射机制与调用&&Class的介绍

java反射机制与调用&&Class的介绍

定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
java反射是基于Class对象进行操作的,每一个.class通过类加载器加载到内存时,都会生成与之对应的Class对象,并且是唯一的(Class的构造是private)。
Class对象获取的三种方式
  • object.getClass():通过该类对象,调用getClass(),生成Class对象
  • Object.class:通过类获取Class对象
  • Class.forName(“com.example.Test”):通过Class调用forName(),参数是全类名。

注意:TYPE语法

Class c1 = Integer.TYPE;

System.out.println(c1.toString());//打印结果:int

Class类中常用的方法
  • forName():静态方法,返回Class对象
  • newInsatnce():返回的是本类对象,调用的是无参构造,如果无参构造被private修饰会抛异常
  • getName():获取类名全称
  • getSuperClass:获取父类
  • getClassLoader():获取加载该类的类加载器对象
  • getAnnotion():获取该类上面的注解
  • getInterface():获取给类的接口
  • isInterface():判断是不是接口
  • getField():参数String,获取被public修饰某个字段的
  • getFileds():获取被public修饰的所有字段
  • getDeclaredField():获取被声明过某个的字段
  • getDeclaredFields():获取被声明过所有的字段
  • getMethod()/getMethods()/getDeclaredMethod()/getDeclaredMethods():与获取Field一样,参数略有不同,详情参考代码
  • getConstructor()/getConstructors()/getDeclaredConstructor()/getDeclaredConstructors():

与反射相关的类与常用的方法
Field
  • setAccessible(boolean flag):值是true,表示反射的对象应该抑制java语言访问。突破访问权限
  • set(Object obj, Object value):参数一:设置值的对象;参数二:表示设置的值。详见代码使用
  • setInt():与set()方法相似。
  • getModifiers():获取该字段的修饰符
Method
  • setAccessible(boolean flag):值是true,表示反射的对象应该抑制java语言访问。突破访问权限
  • invoke(Object obj, Object… args):通过反射调用方法,参数一是调用的对象,参数2是可变参数,表示调用的方法的参数的值
  • getReturnType():获取返回值类型
  • getModifiers():获取该方法的修饰符
Constructor
Modifier

代码实现如下:

User类

package com.example;


public class User {
    private String name;
    protected int age;
    public Integer id;

    private User() {

    }

    public User(String name, int age, Integer id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    protected boolean isChild(int age) {
        return age < 18;
    }

    private void transform(String name, int age, Integer id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public static User query(Integer id) {
        User user = new User();
        user.id = id;
        return user;
    }

    @Override
    public String toString() {
        return "name:" + name + "   age:" + age + "     id:" + id;
    }
}

Test类:

package com.example;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {

        User user = new User("ZHANGSAN", 18, 10086);

        System.out.println(user.toString());

        Class clazz = user.getClass();

        Field f = clazz.getDeclaredField("name");
        f.setAccessible(true);
        f.set(user, "LiSi");

        Field f1 = clazz.getField("id");
        f1.set(user, 110);
        System.out.println(user.toString());

        @SuppressWarnings("unchecked")
        Method m = clazz.getDeclaredMethod("isChild", int.class);
        boolean isChild = (boolean) m.invoke(user, user.age);
        if (!isChild) {
            @SuppressWarnings("unchecked")
            Method m1 = clazz.getDeclaredMethod("transform", String.class, int.class, Integer.class);
            m1.setAccessible(true);
            m1.invoke(user, "XiaoMing", 20, 119);
        }
        System.out.println(user.toString());

        //静态方法的调用
        @SuppressWarnings("unchecked")
        Method m2 = clazz.getMethod("query", Integer.class);
        User u = (User) m2.invoke(null, 38);

        System.out.println(u.toString());

        System.out.println(u.getClass() == clazz);//true   每个类的Class对象是唯一的

        Class c = Class.forName("java.lang.Integer");
        System.out.println(c.toString());

        Class c1 = Integer.TYPE;
        System.out.println(c1.toString());//打印结果:int
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值