java反射机制总结(代码片段)

ywb-articles ywb-articles     2023-03-10     327

关键词:

一.什么是反射

  在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。

二.为什么需要反射

  首先我们要了解Java的编译类型有两种:

    1.静态编译:在编译时确定类型,绑定对象即通过。

    2.动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

  而Java反射机制在Java动态编译的起到了一个关键作用。

三.反射获取Class对象的三种方式(获取字节码对象)

public class ReflectDemo1 
    public static void main(String[] args) throws ClassNotFoundException 
        //方式一(通过Class.forName的方式,括号中是包名.类名)常用
        Class clazz1 = Class.forName("xx.ReflectDemo1");
        //方式二(类名.class)
        Class clazz2 = ReflectDemo1.class;
        //方式三(创建类的实例对象,再通过getClass的方式)
        ReflectDemo1 ref = new ReflectDemo1();
        Class clazz3 = ref.getClass();
        
        System.out.println(clazz1 == clazz2);//true
        System.out.println(clazz2 == clazz3);//true,三个字节码对象是同一个字节码对象
    

四.通过反射获构造器,成员变量,方法等

public class ReflectDemo2 
    private String name;
    public ReflectDemo2(String name) 
        super();
        this.name = name;
    
    @Override
    public String toString() 
        return "[name=" + name + "]";
    
    public void method1()
        System.out.println("你好啊");
    
    public void method2(String name)
        System.out.println("hello"+name);
    

    public static void main(String[] args) throws Exception 
        //通过反射获取有参构造,并通过有参构造创建对象
        Class clazz = Class.forName("course9.ReflectDemo2");
        Constructor c = clazz.getConstructor(String.class);
        ReflectDemo2 ref = (ReflectDemo2) c.newInstance("zx");
        System.out.println(ref);
        //通过反射获取成员变量并使用
        Field f = clazz.getDeclaredField("name");//获取姓名字段(暴力反射获取,即使是私有变量)
        f.setAccessible(true);//设置去除私有权限
        f.set(ref, "ls");
        System.out.println(ref);
        
        //通过反射获取方法并使用
        Method m1 = clazz.getMethod("method1");
        Method m2 = clazz.getMethod("method2",String.class);
        m1.invoke(ref);
        m2.invoke(ref,"张三");
        
    

输出结果如下:

技术图片

五.通过反射越过泛型检查

public class ReflectDemo3 
    public static void main(String[] args) throws Exception 
        //使用反射越过泛型的检查
        ArrayList<Integer> list = new ArrayList<>();//创建一个存放整型的链表
        list.add(11);
        list.add(22);
        Class clazz = Class.forName("java.util.ArrayList");//获取java.util.ArrayList类的字节码对象
        Method m = clazz.getMethod("add", Object.class);//获取其中的add方法
        m.invoke(list, "abc");//链表中添加字符串
        System.out.println(list);
    

 输出结果如下:(“abc”不是Interger类型,但是能存放在创建的链表中)

技术图片

六.反射实现动态代理

 

public class ReflectDemo4 implements User
    public static void main(String[] args) 
        ReflectDemo4 ref = new ReflectDemo4();
        ref.add();
        ref.delete();
        MyInvocationHandler m = new MyInvocationHandler(ref);//创建动态代理类(放入需要代理的对象)
        User user = (User) Proxy.newProxyInstance(ref.getClass().getClassLoader(), ref.getClass().getInterfaces(), m);//获取类加载器和接口
        
        System.out.println("-----------------------");
        user.add();
        user.delete();
    
    @Override
    public void add() 
        System.out.println("添加功能");
    
    @Override
    public void delete() 
        System.out.println("删除功能");
    

interface User
    public void add();
    public void delete(); 


//动态代理类
class MyInvocationHandler implements InvocationHandler
    private Object target;
    public MyInvocationHandler(Object target) 
        super();
        this.target = target;
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        System.out.println("权限校验");
        method.invoke(target, args);//执行被代理target对象的方法
        System.out.println("日志记录");
        return null;
    
    

输出结果如下:(动态代理前的输出和代理后的输出)

技术图片

 七.反射的一些应用

  如加载一些文件

  逆向代码 ,例如反编译

  与注解相结合的框架 例如Spring

  动态生成类框架 例如Gson

java反射机制总结(代码片段)

一.什么是反射  在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功... 查看详情

java题库错题总结(代码片段)

1.Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:( ADF      )AJava反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下B... 查看详情

不藏了,这些java反射用法总结都告诉你们(代码片段)

摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段、方法和构造函数。它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring。可以说,反射机制的特征让Java可以... 查看详情

java反射机制(代码片段)

反射反射反射机制什么是反射?反射的优缺点class类类加载阶段类加载的生命周期反射的使用Class类的对象获取Constructor类及其用法Field类及其用法Method类及其用法相关面试题大家好呀!我是小笙!本节我和大家分享一... 查看详情

java反射学习总结(代码片段)

Java反射机制提供了什么功能:1、获取Class对象,在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。可通过如下方式获取:1.1调用getClass:Booleanvar1=true;Class<?>... 查看详情

java基础java反射机制浅解(代码片段)

文章目录反射的某场景说明反射代码应用代码安全问题总结基础知识类、实例、Class实例(第2行代码)参考反射的某场景说明应用场景:当我们在使用IDE,比如Ecplise时,当我们输入一个对象或者类,并想调用他... 查看详情

java_反射机制(代码片段)

文章目录Java_反射(Reflection)机制Java_反射机制的作用Java_反射相关的主要APIJava_Class类Java_Class类常用方法Java_获取Class类的实例(四种方法)Java_哪些类型`Class`对象Java_反射(Reflection)机制Reflection(反射)是被视为动态语言... 查看详情

java反射机制(代码片段)

文章目录一、概念1.什么是反射?2.反射的用途3.反射的基本信息4.Class类(反射机制的起源)二、反射的使用1.获取Class类的三种方法2.创建对象3.反射私有的构造方法4.反射私有属性5.反射私有方法所有代码三、反射优点和缺点完&... 查看详情

java反射机制(代码片段)

什么是Java的反射机制?Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为J... 查看详情

反射机制(代码片段)

1、反射机制1.1、反射机制有什么用?通过java语言中的反射机制可以操作字节码文件。优点可以读和修改字节码文件。通过反射机制可以操作代码片段。(class文件。)1.2、反射机制的相关类在哪个包下?java.lang.reflect.*;1.3、... 查看详情

java的反射机制(代码片段)

文章目录JAVA的反射机制1、反射机制2、Class类3、如何获得Class类型的实例?4、构造类的实例化对象5、获取类的所有信息1、获取类中的Field(变量)2、获取类中的Constructor(构造器)3、获取类中的Method(普通方法)JAVA的反射机制反射... 查看详情

java基础知识点笔记总结(十一)(代码片段)

文章目录1.反射机制2.创建Person类以及其他的一些注解接口等(方便后面测试其他方法使用)3.两个疑问(看自己理解)4.java.lang.Class类的理解5.如何获取Class实例的4中方式6.Class实例可以是哪些结构?7.类的加载与ClassLoader的理解7.1类... 查看详情

java基础整理-80.java反射机制(代码片段)

Java什么是反射机制?反射机制的概念  在ORM(ObjectRelationalMapping 对象关系映射)中间件的实现中,运用java反射机制可以读取任意一个JavaBean的所有属性,或者给这些属性赋值。ClasslabelCls=label1.getClass();//label1为JLabel类的对象Jav... 查看详情

java的反射机制(代码片段)

...:https://www.cnblogs.com/ysocean/p/6516248.html1.  什么是Java的反射机制?   Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它... 查看详情

java的反射机制入门(代码片段)

理解Java的反射机制对学习Java框架有很大帮助,比如Spring框架的核心就是使用Java反射实现的,同时对做一些Java底层操作也会有帮助,比如字节码操作、自定义注解等。什么是反射Java反射说的是在运行状态中,对于任何一个类,... 查看详情

反射机制补充(代码片段)

1.通过反射机制访问一个java对象的属性packagecom.bjpowernode.java.reflect;importcom.bjpowernode.java.bean.Student;importjava.lang.reflect.Field;/*必须掌握:怎么通过反射机制访问一个java对象的属性?给属性赋值set获取属性的值get*/publicclass 查看详情

java反射机制(代码片段)

文章目录JAVA反射机制一、概念:二、Class类1.概念2.获取Class对象的方式3.常用方法三、Constructor类1.概念:2.常用方法四、Field类1.概念2.常用方法五、Method类1.概念2.常用方法六、获取其他信息方法JAVA反射机制一、概念:... 查看详情

java核心技术梳理-类加载机制与反射(代码片段)

一、引言反射机制是一个非常好用的机制,C#和Java中都有反射,反射机制简单来说就是在程序运行状态时,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,能够调用它的任意属性和方法,其实初听就知... 查看详情