首页 > 其他分享 >反射

反射

时间:2023-02-24 01:55:05浏览次数:32  
标签:反射 java aClass System 获取 println public


多态是不能调用子类独有的方法的,形象来说程序是不知道user是个child
如果能在运行过程中知道user是什么类型,那就能用child里面的方法了
好比通过照镜子知道自己长什么样,java中就有反射这种机制在运行中得到对象的类型等相关信息

通过反射的方式来获取整体的对象--类对象

Class<? extends User> aClass = user.getClass();//类对象


编译后的字节码文件
javap是java提供的反编译cmd命令

创建完类对象就能根据类对象获取一些信息了

package Reflect;

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

public class demo {
    public static void main(String[] args) throws Exception{
        User user = new Child();
        Class<? extends User> aClass = user.getClass();//类对象
        //java万物皆对象,Class对应编译后的字节码文件.class

        //获取类名
        System.out.println(aClass.getName());//Reflect.Child 包名.类名
        System.out.println(aClass.getSimpleName());//类名 Child
        System.out.println(aClass.getPackage());//类所在的包 package Reflect

        //获取类的父类
        System.out.println(aClass.getSuperclass());//class Reflect.User

        //获取类的接口
        Class<?>[] interfaces = aClass.getInterfaces();
        System.out.println(interfaces.length);//0 Child类没实现任何接口

        //获取类的属性
        //Field是属性对象
        Field f1 = aClass.getField("xxx");//根据传入的字符串如xxx来获取对应的属性,只能获取public
        Field f2 = aClass.getDeclaredField("xxxx");//获取属性名为xxxx的属性,不论权限(包括private)

        Field[] fields = aClass.getFields();//获取所有权限为public的属性
        Field[] declaredFields = aClass.getDeclaredFields();//获取所有属性(包括private)

        //获取类的方法
        //Method是方法对象
        Method m1 = aClass.getMethod("xx");//获取方法名为xx的方法,只能获取public修饰的方法
        Method m2 = aClass.getDeclaredMethod("xxx");//获取名为xxx的方法,不论权限

        Method[] methods = aClass.getMethods();//获取所有public修饰的方法
        Method[] declaredMethods = aClass.getDeclaredMethods();//获取所有方法

        //获取构造方法
        //Constructor是构造器对象
        Constructor<? extends User> constructor = aClass.getConstructor();
        Constructor<?>[] constructors = aClass.getConstructors();
        Constructor<? extends User> declaredConstructor = aClass.getDeclaredConstructor();
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();

        //获取权限(修饰符)
        int modifiers = aClass.getModifiers();//多个修饰符融合成了1个int值
        //Modifier提供方法来判断是否为xx修饰符,涉及位运算
        boolean aProtected = Modifier.isProtected(modifiers);//判断是否有protected修饰符
        System.out.println(modifiers);
        System.out.println(aProtected);

    }
}
class User {
    public void test1(){
        System.out.println("test1");
    }
}
class Child extends User{
    public void test2(){
        System.out.println("test2");
    }
}

用反射实现登录功能

package Reflect;

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

public class demo {
    public static void main(String[] args) throws Exception{
        //不直接创建对象,而是构造方法对象
        //先拿到类对象
        Class employeeClass = Employee.class;//拿到了Employee这个类的信息,等同于拿到了字节码文件
        //再拿到构造方法对象
        Constructor declaredConstructor = employeeClass.getDeclaredConstructor();
        /*Employee类没写构造器,JVM会默认提供一个声明的无参构造器*/
        //通过构造方法来构造实例
        Object emp = declaredConstructor.newInstance();//构建出了Employee的对象emp
        //实现登录验证需要获取属性
        Field fUsername = employeeClass.getField("username");
        Field fPassword = employeeClass.getField("password");
        //属性赋值
        fUsername.set(emp,"admin");//set赋值,(对象,值)
        fPassword.set(emp,"123456");
        //获取方法
        Method mLogin = employeeClass.getMethod("login");
        //调用方法
        Object result = mLogin.invoke(emp);//调用emp的login(mLogin对应的login)方法
        System.out.println(result);//true
    }
}
class Employee {
    public String username;
    public String password;

    public boolean login(){
        if("admin".equals(username) && "123456".equals(password)){
            return true;
        }else {
            return false;
        }
    }
}

反射最重要的用途就是开发各种通用框架。

类加载器

标签:反射,java,aClass,System,获取,println,public
From: https://www.cnblogs.com/ben10044/p/17150014.html

相关文章

  • reflect反射结构体
    packagemainimport( "fmt" "reflect")typeUnivercitystruct{ Namestring Ageint}func(uUnivercity)Sport(){ fmt.Println("学校开展运动会")}......
  • Java 反射
    1.小demo快速上手读取配置文件信息,实现调用方法@SuppressWarnings({"all"})//取消显示指定的编译器警告publicclassReflectionQuestion{publicstaticv......
  • Java ”框架 = 注解 + 反射 + 设计模式“ 之 反射详解
    Java”框架=注解+反射+设计模式“之反射详解每博一文案无论幸福还是苦难,无论光荣还是屈辱,你都要自己遭遇与承受。——————《......
  • Java ”框架 = 注解 + 反射 + 设计模式“ 之 注解详解
    Java”框架=注解+反射+设计模式“之注解详解每博一文案刹那间我真想令时光停住,好让我回顾自己,回顾失去的年华,缅怀哪个穿一身短小的连衣裙和瘦窄的短衫的小......
  • C++反射机制实现
    直接上代码#include<iostream>#include<map>classBase{public:virtualvoidhello()const=0;};classA:publicBase{public:A(){......
  • Go 中的反射 reflect 介绍和基本使用
    一、什么是反射在计算机科学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候......
  • 反射概述
    反射概述及动态代理Author:MsuenbDate:2023-02-21Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能......
  • 16 反射
    16反射16.1通过案例体会反射的好处16.2通过概念再体会反射16.3Class类的理解16.4提供丰富的类16.5获取字节码信息的四种形式16.6可以作为Class类的实例的种类......
  • java基础 -- 反射深入浅出与CLass源码解析
    java反射在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的......
  • 韩顺平老师讲解反射
    反射(reflection)1.一个需求引出反射1.1请看下面的问题根据配置文件re.properties指定信息,创建Cat对象并调用方法hiclassfullpath=com.yujianedu.Catmethod=hi......