浅谈Java的反射机制

目录

一、什么是反射?

二、反射的基础Class

1.简单理解概念

2.获取Class对象的三种方法:

1、用对象名.getClass()获取

2、用类名.class获取

3.Class类的forName()方法用目标对象名获取

三、Constructor类

四、Field类

五、Method类

1、通过Class对象的如下方法得到Method对象

2、关于方法参数的操作

3、关于修饰符

总结

一、什么是反射?

        小编个人理解:就是将Java类中的一切信息映射(创建)成一个对应的类:属性(字段或成员变量)、方法、构造方法、包等。通过创建Class类对象获取或类中的其他类进行操作。

二、反射的基础Class

1.简单理解概念

        Java当中的类用来表示具有相同属性的方法和对象的结合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性值。

简单理解:
不同的动物-> Animal

Java中不同的类->Class

2.获取Class对象的三种方法:


1、用对象名.getClass()获取

Animal a1=new Animal(); a1.getClass();

2、用类名.class获取

Animal.class

3.Class类的forName()方法用目标对象名获取

Class.forName(“java.lang.String”);

3.可进行的部分操作

	//获取Class类型信息
	public static void printClassInfo(Class cls) {
		
		//类名
		System.out.println("类(接口)的名称:" + cls.getSimpleName());
		System.out.println("完全限定名:" + cls.getName());
		System.out.println("类(接口的类型名称):" + cls.getTypeName());
		
		//父类
		Class superCls = cls.getSuperclass();
		System.out.println("类的父类:" + superCls.toString());
		
		//实现的接口
		Class[] interfacesCls = cls.getInterfaces();
		System.out.println("当前类实现的接口:");
		for(Class icls : interfacesCls) {
			System.out.println(icls);
		}
		
		//package包
		Package pck = cls.getPackage();
		if(pck != null) {
			System.out.println("类所在包的名称:" + pck.getName());
		}
		
		//判断类型
		System.out.println("是否为接口:" + cls.isInterface());
		System.out.println("是否为数组:" + cls.isArray());
		System.out.println("是否为枚举:" + cls.isEnum());
	}

 

三、Constructor类

用来描述类中所定义的构造方法。

  1. 得到类的所有构造方法

Constructor constructors【】=

Class.forName(“java.lang.String”).getConstructors();

  1. 得到类中某个具体的构造方法,在getConstructor中传入参数类型所对应的字节码

Constructor constructor=

Class.forName(“java.lang.String”).getConstryctor(String.class)

使用Consyructor类的目的是用来创建相对应类的对象

正常情况:   Stirng str=new String(“hello”);

反射情况:   Constructor con=String.class.getConstructor(String.class)

                       String str=(String)con.nwelnstance(“hello”);

Classs.newlnstance()

通过反射方式创建对象的过程

Class-àConstructor-à某个类的对象

只有当要用某个类的无参构造方法创建该类对象时,可以省略创建Constructor类对象的这个过程。

  Date d = (Date)Class.forName(“java.util.Date”).newlnstance();

四、Field类

Field类用来表示类中的属性(字段)。

  1. Class.getFields():得到Class对象的所有字段,返回的是Field数组。
  2. Class.getField(String name) 返回一个Field对象,反映此Class对象所表示的类或接口的指定公有成员字段。
  3. Field的对象所代表的某个类的属性,而不是那个类的某个对象的属性。要得到某个对象对应的属性值,需要通过get(Object.obj)方法与某个对象具体关联。
  4. 对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到。
  5. 对于私有属性要得到它所关联的对象的值,需要通过Field的setAccessible(boolean boolean)方法设置。
  6. Field类的getType()方法用来得到字段所属的类型

五、Method类

用来表示类中的方法。

1、通过Class对象的如下方法得到Method对象

Method getMethod(String name,classs<?>…para,eterTypes)

按名称得到特定的public方法(包括从父类或接口继承的方法)

Method[] getMethods()

得到public方法(包括从父类或接口继承的方法)

Method[] getDeclaredMethods()

得到所有方法(不包括继承的方法)

Method getDeclaredMethod(String name,Class<?>…parameterTypes)

按名称得到某个特定的方法(不包括继承的方法)

2、关于方法参数的操作

(1) int getParameterCount ()

获取该Method对象所表示方法的参数数量。

(2) Parameter [] getParameters ()

返回一个Parameter对象数组,表示该 Method 对象所表示方法的所有参数。

(3) Class <?>[] getParamerTypes ()

获取该 Method 对象所表示方法的所有参数类型的数组。

(4) Type [] getGenericParameterTypes ()

获取该Method对象所表示方法的所有参数类型的数组,一般情况下,同 getParameterTypes ()方法的返回值一样,如果存在则该方法会返回泛型的类型。

3、关于修饰符

(1) int getModifiers ()

得到方法前面所定义的修饰符.

返回类、接口、变量、方法等以整数编码的 Java 语言修饰符,访问修饰符编码列表。

Modifier 类一共提供了12中修饰符的编码表示常量

public static final int PUBLIC    =0x00000001;

public static final int PRIVATE    =0x00000002;

public static final int PROTECTED =0x00000004;

public static final int STATIC     =0x00000008;

public static final int FINAL      =0x00000010;

public static final int SYNCHRONIZED =0x00000020;

public static final int VOLATILE      =0x00000040;

public static final int TRANSIENT     =0x00000080;

public static final int NATIVE         =0x00000100;

public static final int INTERFACE      =0x00000200;

public static final int ABSTRACT       =0x00000400;

public static final int STRICT           =0x00000800;

java.lang.reflect.Modifier类提供解码类和成员访问修饰符的静态方法和常量,修饰符集合被表示为具有表示不同的修饰符的不同位置的整数。

总结

        反射就是将Java类中的一切信息映射(创建)成一个对应的类:属性(字段或成员变量)、方法、构造方法、包等。通过创建Class类对象获取或类中的其他类进行操作。

        了解Class对象部分知识及获取Class对象的三种方式。

        简单了解Constructor类(构造方法),Field类(属性,字段),Method类(方法)。

        

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值