欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中反射机制(Reflection)研究及源码演示

程序员文章站 2022-03-24 12:22:17
如下内容内容是关于 Java中反射机制(Reflection)研究及演示的内容。 package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public static voi ......

如下内容内容是关于 java中反射机制(reflection)研究及演示的内容。

 

package com.jiangqq.reflection;
import java.lang.reflect.method;
public class reflection1 {
public static void main(string[] args) throws exception {
class<?> tclass = class.forname("java.lang.class");
method[] methods = tclass.getdeclaredmethods();
for (method method : methods) {
system.out.println(method);
}
}
}




(三)查看class的api发现class类是reflectionapi中的核心类,它有以下几个常用的方法①:getname():获得类的完整名字。②:getfields():获得类的public类型的属性。③:getdeclaredfields():获得类的所有属性。④:getmethods():获得类的public类型的方法。⑤:getdeclaredmethods():获得类的所有方法。⑥:getmethod(stringname,class[]parametertypes):获得类的特定方法,name参数指定方法的名字parametertypes参数指定方法的参数类型。⑦:getconstructors():获得类的public类型的构造方法。⑧:getconstructor(class[]parametertypes):获得类的特定构造方法,parametertypes参数指定构造方法的参数类型。⑨:newinstance():通过类的不带参数的构造方法创建这个类的一个对象。先看上面的⑧和⑨其中都能生成对象,但是因为构造函数有无参和有参构造函数两种,所以我们分两种情况考虑情况一:如果是无参的构造函数来生成对象:<a>首先我们去获取class对象,然后直接通过class对象去调用newinstance()方法就可以



class<?> tclass = reflection2.class;
object reflection2 = classtype.newinstance();

 




首先我们也是去获取class对象,然后去去调用getconstructor()得到constructor对象,接着直接调用newinstance()即可


 

class<?> classtype = reflection2.class;
t reflection2 = classtype.newinstance();
constructor<?> constructor = classtype.getconstructor(new class[] {});
reflection2 = constructor.newinstance(new object[] {});

 




情况二:现在是有参构造函数,那我们只有一种方法来通过反射生成对象:



class<?> tclass = person.class;
constructor cons = classtype.getconstructor(new class[]{string.class, int.class});
object obj = cons.newinstance(new object[]{“zhangsan”, 19});





接下来根据以上的一些常用的方法,使用反射举几个例子(使用反射来访问类中的方法):



package com.jiangqq.reflection;
import java.lang.reflect.constructor;
import java.lang.reflect.method;
public class reflection2 {
public int sum(int a, int b) {
return a + b;
}
public string addstr(string str) {
return "this is the:" + str;
}
public static void main(string[] args) throws exception {
class<?> classtype = reflection2.class;
constructor<?> constructor = classtype.getconstructor(new class[] {});
object reflection2 = constructor.newinstance(new object[] {});
method summethod = classtype.getmethod("sum", new class[] { int.class,
int.class });
object result1 = summethod.invoke(reflection2, new object[] { 6, 10 });
system.out.println((integer) result1);
method addstrmethod = classtype.getmethod("addstr",
new class[] { string.class });
object result2 = addstrmethod.invoke(reflection2,
new object[] { "tom" });
system.out.println((string) result2);
}
}





④:通过反射机制调用对象的私有方法,访问对象的私有变量....我们大家都知道,在java语言中,如果我们对某些变量,或者方法进行private的声明,然后我们在其他类中进行不能去调用这些方法和变量,但是通过反射机制,这些私有声明将不复存在【提醒一点:在写程序的时候,我们最好不要故意经常去使用反射机制来打破这种私有保护...】要实现这种功能,我们需要用到accessibleobject类中的publicvoidsetaccessible(booleanflag)方法:使用这个方法,把参数flag设置成true,然后我们的field或者method就可以绕过java语言的语法访问的检查具体使用如下:<a>使用反射去访问私有方法



package com.jiangqq.reflection;
public class test01 {
private string getname(string name) {
return "this i:" + name;
}
}


package com.jiangqq.reflection;
import java.lang.reflect.method;
public class testprivate01 {
public static void main(string[] args) throws exception {
test01 p = new test01();
class<?> classtype = p.getclass();
method method = classtype.getdeclaredmethod("getname",
new class[] { string.class });
method.setaccessible(true);
object object = method.invoke(p, new object[] { "tom" });
system.out.println((string)object);
}
}

 





使用反射机制去访问私有变量:


 

package com.jiangqq.reflection;
public class test02 {
private string name="张三";
private string getname()
{
return name;
}
}


package com.jiangqq.reflection;
import java.lang.reflect.field;
import java.lang.reflect.method;
public class testprivate02 {
public static void main(string[] args) throws exception {
test02 p = new test02();
class<?> classtype = p.getclass();
field field = classtype.getdeclaredfield("name");
field.setaccessible(true);
field.set(p, "李四");
method method = classtype.getdeclaredmethod("getname", new class[] {});
method.setaccessible(true);
object object = method.invoke(p, new object[] {});
system.out.println((string) object);
}
}