zoukankan      html  css  js  c++  java
  • JavaSE之反射

    反射

    概述:反射是框架设计的灵魂

    java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制。
    利用反射技术可以将一个类中各个组成部分映射成一个个对象。
    反射的原理在于class对象,Class对象是将class文件读入内存,并为之创建一个Class对象。
    

    使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

    虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
    基本的Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字void 也都对应一个Class对象。 
    每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class对象。
    一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
    

    获取class对象的三种方式

    1.Object的getClass()方法;
    2.任何数据类型(包括基本数据类型)都有一个“静态”的class属性;Student.class
    3.通过Class类的静态方法:forName(String  className)(常用);注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
    
    package fanshe;
    /**
     * 获取Class对象的三种方式
     * 1 Object ——> getClass();
     * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
     * 3 通过Class类的静态方法:forName(String  className)(常用)
     *
     */
    public class Fanshe {
    	public static void main(String[] args) {
    		//第一种方式获取Class对象  
    		Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
    		Class stuClass = stu1.getClass();//获取Class对象
    		System.out.println(stuClass.getName());
    		
    		//第二种方式获取Class对象
    		Class stuClass2 = Student.class;
    		System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
    		
    		//第三种方式获取Class对象
    		try {
    			Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
    			System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    		
    	}
    }
    

    调用方法

    1、获取构造方法:
    	(1)批量获取:
    		public Constructor[] getConstructors():所有"公有的"构造方法
    		public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
    	(2)单个获取
    		public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法
    		public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有
    	(3)调用构造方法
    		Constructor-->newInstance(Object... initargs)
    		此处newInstance是Constructor类的方法,使用newInstance构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
    		返回值类型是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象,并为之调用。
    
    2、获取成员变量:
    	1.批量的
    	(1)Field[] getFields():获取所有的"公有字段"
    	(2)Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
    	2.获取单个的:
    	(1)public Field getField(String fieldName):获取某个"公有的"字段;
    	(2)public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
    设置字段的值:
    	Field --> public void set(Object obj,Object value):
    参数说明:
    	1.obj:要设置的字段所在的对象;
    	2.value:要为字段设置的值;
    	3.获取成员方法:
    
    1.批量:
    	(1)public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
    	(2)public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
    2.单个:
    	(1)public Method getMethod(String name,Class<?>... parameterTypes);	name:方法名	class...:形参的class类型对象
    	(2)public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
    注意:Method--> public Object invoke(Object obj,Object... args):
    参数:obj:要调用方法的对象		args:调用方法时所传递的实参
    
    4.反射main方法
    	部分内容查看原文
    

    原文链接:https://blog.csdn.net/sinat_38259539/article/details/71799078

  • 相关阅读:
    PHP面向对象练习
    PHP面向对象的特点
    PHP的构造函数和析构函数
    PHP面向对象
    AVL-TREE
    ReentrantLock
    treap-名次树-树堆
    细数那些我们熟悉的 排序!
    数据结构 - trie
    python 凸包(经纬度) + 面积[近似]
  • 原文地址:https://www.cnblogs.com/njuptzheng/p/13245764.html
Copyright © 2011-2022 走看看