java反射机制

什么是 java 的反射机制?
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用他 的任意一个方法和属性,种种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

Java 有个 Object 类,是所有 java 类的继承根源,其声明了多个可以在所有 java 类中被改写的方法,其中就有 getClass 方法,该方法返回一个 Class 对象。

Class 类十分特殊。他和一般类一样继承与 Object,他实体用来表示 java 程序运行时的 classes 和 interface,也 用来表示 enum,array,int…。当一个 class 被加载,或当加载器的 defineClass()被 JVM 调用,JVM’便自动产生一个 Class 对象。

Class 类提供了大量的实力方法来获取该 Class 对象所对应的详细信息,Class 类大致包含如下方法:
获取类内的信息:
获取内容: 构造器。

Constructor<T> getConstructor(Class<?>...Types)//获取公有的构造方法

包含的方法:Method getMethod(String name,Class<?>...Types) 
包含的属性:Field getField(String name)
包含的 Annotation :<A extends Annotation> A getAnnotation(Class<A>annotationClass) 
内部类:Class<?>getDeclaredClasses() 
外部类:Class<?> getDeclaringClasses() 所实现的接口:Class<?> [] getInterfaces() 
修饰符: int getMoifiers() 
所在包:Package getPackage()
类名:String getName() 
简称: String getSimpleName()   
getDeclaredConstructor();//可以获取私有的构造方法

在这里插入图片描述

反射机制的作用:
1 反编译:.class->.java
2 通过反射机制访问 java 对象的属性方法,构造方法等

反射机制获取类有三种方法:
一、获取 People 类型
1 第一种方式: Class c1= Class.forName(“People”);
2 第二种方式:java 中每个对象都有 class 属性。 Class c2 =Employee.class;
3 第三种方式:java 语言中任何一个 java 对象都有 getClass 方法。 People p=new People(); Class c3 = p.getClass();
二、创建对象:获取类以后我们来创建对象,利用 newInstance 方法 Class c = Class.forName(“People”); //创建此 Class 对象所表示的类的一个新实例
Object O = c.newInstance();//调用 People 的无参构造方法

//反射出无参的构造方法并得到对象 
String classname1="org.example.hello.People";
Class class1=Class.forName(classname1); 
Object object1=class1.newInstance(); 
System.out.println(object1.toString()); 
//反射出带参数的构造方法并得到对象 
String classname2="org.example.hello.People"; 
Class class2=Class.forName(classname2); 
Constructor constructor1=class2.getConstructor(String.class,int.class); 
//*********int.class 表示是 int 类型,Integer.class 表示 java.lang.Integer 类型*******// 
Object object2=constructor1.newInstance("小明",18); 
System.out.println(object1.toString()); 
//调用对象的带参数的方法 
String classname3="org.example.hello.People"; 
Class class3=Class.forName(classname3); 
Method method=class3.getMethod("fun", int.class); 
Object object3=class3.newInstance(); 
method.invoke(object3,1); 
System.out.println(object3.toString()); 
 
Object object=c.newInstance(); 
java.lang.reflect.Field f=constructor.getDeclaredField("name"); 
f.setAccessible(true);//如果当前属性是私有,修改属性信息需要添加该代码,设访问权限 
f.set(object, "zs");//设置类中的私有属性信息 

三、invoke 方法的作用
Invoke 方法用来执行实例中的方法。相当于“ .方法名”。


Constructor con=c.getDeclaredConstructor(String.class);
 con.setAccessible(true); 
 Object o =con.newInstance("zs"); 
 Method m=c.getMethod("publicFun", String.class); 
 Object result = m.invoke(o, "publicFun"); 
 System.out.println(result); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值