9、反射介绍


Java零基础极速入门-讲师:海波

失败,是正因你在距成功一步之遥的时候停住了脚步。


1、镜中的自己

public class Demo {
    public static void main(String[] args){
    // 类对象就是类的模板,可以获取类的一切信息
        // 类对象(Java编译的字节码文件,JVM加载成一个对象)
        User user = new User();
        Class<? extends User> aClass = user.getClass();
    }
}
class User {
    
}

2、字节码

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

        Child child = new Child();
        // 类对象(Java编译的字节码文件,JVM加载成一个对象)
        Class<? extends Child> aClass = child.getClass();

        // 获取类的名称
        System.out.println(aClass.getName()); //获取包名+类名
        System.out.println(aClass.getSimpleName()); //获取类名
        //System.out.println(aClass.getPackageName()); //获取包名

        // 获取父类
        System.out.println(aClass.getSuperclass());

        // 获取类的接口
        System.out.println(aClass.getInterfaces().length);

        // 获取属性
        Field xxx = aClass.getField("name"); // 权限public
        Field xxx1 = aClass.getDeclaredField("name"); // 所有权限

        Field[] fields = aClass.getFields(); // 所有权限public
        Field[] fields1 = aClass.getDeclaredFields(); // 所有权限

        // 获取方法
        Method test2 = aClass.getMethod("test2"); // 权限public
        Method test21 = aClass.getDeclaredMethod("test2"); // 所有权限

        Method[] methods = aClass.getMethods(); // 权限public
        Method[] methods1 = aClass.getDeclaredMethods(); // 所有权限

        // 获取构造函数
        Constructor<? extends Child> constructor = aClass.getConstructor();
        Constructor<?>[] constructors = aClass.getConstructors();
        Constructor<? extends Child> constructor1 = aClass.getDeclaredConstructor();

        // 获取权限(修饰符)
        int modifiers = aClass.getModifiers();

        System.out.println(Modifier.isProtected(modifiers));
        System.out.println(Modifier.isPrivate(modifiers));
        System.out.println(Modifier.isPublic(modifiers));
        System.out.println(Modifier.isTransient(modifiers));
        System.out.println(Modifier.isFinal(modifiers));
        System.out.println(Modifier.isAbstract(modifiers));
        System.out.println(Modifier.isInterface(modifiers));
        System.out.println(Modifier.isNative(modifiers));
        System.out.println(Modifier.isStatic(modifiers));
        System.out.println(Modifier.isStrict(modifiers));
        System.out.println(Modifier.isSynchronized(modifiers));
        System.out.println(Modifier.isVolatile(modifiers));
        System.out.println(modifiers);
        System.out.println(Modifier.toString(modifiers));
    }
}

class User {
    public User() {
    }

    public void test1() {
        System.out.println("test1...");
    }
}

class Child extends User {
    public String name;

    public Child() {
    }

    public void test2() {
        System.out.println("test2...");
    }
}

3、类加载器

public class Demo {
    public static void main(String[] args) {
        // 加载类
        // Java中的类主要分为3种:
        // 1.Java核心类库中的类:String、Object
        // 2.JVM软件平台开发商
        // 3.自己写的类:User、Child
        // 类加载器也有3种
        // 1.BootClassLoader:启动类加载器(加载类时,采用操作系统平台语言实现)
        // 2.PlatformClassLoader:平台类加载器
        // 3.AppClassLoader:应用类加载器

        // 获取类的信息
        Class<Student> student = Student.class;
        // 获取类的加载器对象
        ClassLoader classLoader = student.getClassLoader();
        // 打印 AppClassLoader应用类加载器
        System.out.println(classLoader);
        // 打印 AppClassLoader的加载器 PlatformClassLoader平台类加载器
        System.out.println(classLoader.getParent());
        // 打印 PlatformClassLoader平台类加载器 的加载器
        System.out.println(classLoader.getParent().getParent());

        // 加载 Java核心类库 > 平台类库 > 自己类
    }
}
class Student{

}

4、练习

public class Demo {
    public static void main(String[] args) throws Exception {
        // 反射练习
        // 获取class对象
        Class<Emp> empClass = Emp.class;
        // 获取构造方法
        Constructor<Emp> constructor = empClass.getDeclaredConstructor();
        // 创建类
        Emp emp = constructor.newInstance();
        // 获取属性
        Field account = empClass.getField("account");
        Field password = empClass.getField("password");
        // 属性赋值
        account.set(emp,"admin");
        password.set(emp,"admin");
        // 获取方法
        Method login = empClass.getMethod("login");
        // 执行方法
        Object result = login.invoke(emp);
        // 执行结果
        System.out.println(result);

    }
}
class Emp{
    public String account;
    public String password;

    public boolean login(){
        if ("admin".equals(account) || "admin".equals(password)){
            return true;
        }else{
            return false;
        }
    }
}

5、常见异常

// 反射常见异常
// 1.ClassNotFoundException 类找不到异常
// 2.NoSuchMethodException 方法找不到异常
// 3.NoSuchFieldException 属性找不到异常
// 4.IllegalArgumentException 参数异常
// 5.IllegalAccessException 访问权限异常
// 6.InvocationTargetException 调用目标异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值