栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

反射机制原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

反射机制原理

简介:

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

反射概念(简单):

反射机制也被应用到了视窗系统、操作系统和文件系统中。 Java中,反射是一种强大的工具。它使你能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。


1.什么是反射?

反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。

2、反射机制的优缺点?
优点:能够运行时动态获取类的实例,提高灵活性;可与动态编译结合

缺点:使用反射性能较低,需要解析字节码,将内存中的对象进行解析。

3、Java反射API有几类?
反射 API 用来生成 JVM 中的类、接口或则对象的信息。

Class 类:反射的核心类,可以获取类的属性,方法等信息。

Field 类:Java.lang.reflec包中的类,表示类的成员变量,可用来获取和设置类之中的属性值。

Method 类:Java.lang.reflec包中的类,表示类的方法,可用来获取类中的方法信息或者执行方法。

Constructor 类:Java.lang.reflec包中的类,表示类的构造方法。

4.如何得到类对象

一切反射相关的代码都从获得类对象开始

 3种获取方式:        

         1 类名.class;
         2 对象名.getClass();
         3 Class.forName(全限定名/全路径名)

        //反射方式
		Class cls = Class.forName("com.reflect.entity.Hello");
   		Object hello1 = cls.newInstance();      

        //3.一切与反射相关的操作都从获取类对象开始。
		//1)类名.class
		//Class cls=Hello.class;
		//2)实例化对象名.getClass()
		//Class cls = hello.getClass();
		//3)Class.forName(类的全路径名/全限定名)
		//Class cls = Class.forName("com.reflect.entity.Hello");
		System.out.println("获取类的全路径名:"+cls.getName());
		System.out.println("获取简单类名:"+cls.getSimpleName());
		System.out.println("获取访问修饰符:"+cls.getModifiers());
		System.out.println("获取包名:"+cls.getPackage());

根据类得到类名(全限定名/全路径名)

         获取全限定名:cls.getName();            
         获取类名:cls.getSimpleName();   

         获取访问修饰符:cls.getModifiers();   
         获取包名 :   cls.getPackage();             


 反射机制实例化对象 

        //获取类对象
		Class cls=Student.class;
		//反射机制实例化对象
		Student stu = (Student) cls.newInstance();

5、根据类得到类的属性 (读写属性(Field))

语法格式:Field field=cla.getField(“属性名”);

案例展示:

        //1)获取单个公共的属性
		//Field field = cls.getField("age");
		
		//2)获取单个公共的、私有的、最终的等等属性
		//属性的访问修饰符1:代表public  2:代表private  0:代表没有修饰符
		//Field field = cls.getDeclaredField("age");
		
		//3)获取所有公共的属性
		//Field[] fields = cls.getFields();
		//然后foreach
		
		//4)获取所有公共的、私有的、受保护的、最终的等等属性
		Field[] fields = cls.getDeclaredFields();
		for (Field field : fields) {
			System.out.println("获取属性名:"+field.getName());
			System.out.println("获取属性的访问修饰符:"+field.getModifiers());
			System.out.println("获取属性类型:"+field.getType());
		}

    获取属性名:field.getName();                        
    获取属性类型: filed.getType();                    
    获取属性访问修饰符 :field.getModifiers();               


6、根据类得到类的方法(调用方法及构造函数)

        //有参有返回、有参无返回;无参有返,无参无返回
		//1)获取单个公共的方法
		//参数1:Student中给定的方法,无参
		//Method method = cls.getMethod("hello", null);
		
		//2)获取单个公共的、私有的、最终的等等方法
		//Method method = cls.getDeclaredMethod("add",Integer.class, Integer.class);
		
		//3)获取所有公共的方法
		//Method[] methods = cls.getMethods();
		//foreach
		
		//4)获取所有公共的、私有的、受保护的、最终的等等方法
		
		
		//5)调用方法
		//Method method = cls.getMethod("hello", null);//无参
		//Method method = cls.getMethod("hello", String.class);//有参
		
		//执行方法
//		Object returnValue = method.invoke(stu, "黄名季");
//		System.out.println(returnValue);

         获取方法名:method.getName();
         获取访问修饰符:method.getModifiers();
         获取参数数量:method.getParameterCount();
         获取返回类型:method.getReturnType();


赋值 取值 

        //赋值
		
		
		//取值
		//参数1:实例化对象名
		

 7、根据类得到类的实现接口列表

Class[] interface=cla.getInterfaces();   //获取类对象中所有实现接口列表

8、调用构造函数 

        Constructor con=cls.getDeclaredConstructor(Integer.class);
		//权限设置
		con.setAccessible(true);
		con.newInstance(18);

 Question:传统实例方式与反射方式的区别?

传统实例方式:实例化对象就是生成的对象,在Java通过new关键字来实例化一个对象

  例如:Hello hello = new Hello();

反射方式:反射机制是Java语言特有的,它最主要的作用是为了运行期间得到对象的结构(包括成员变量,方法,构造方法等),并可以在允许的情况下访问这些属性和方法。

        //获取类对象
        Class cls=Student.class;
        //反射机制实例化对象
        Student stu = (Student) cls.newInstance();

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/974030.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号