【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);

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值