
第一种:通过forName()方法;
第二种:类class;
第三种:对象getClass()。
举例如下:
package
test;
public class Demo{
public static void
main(){
Class<> c1 = null;
Class<> c2 =
null;
Class<> c3 =
null;
//三种反射用实例化方式
try{
//最常用的一种形式
c1 =
ClassforName("testX");
}catch(ClassNotFoundException
e){
eprintStackTrace();
}
//通过Object类中的方法实例化
c2
= new X()getClass();
//通过类class实例化
c3 =
Xclass;
Systemoutprintln("类名:" + c1getName());
//得到类名
Systemoutprintln("类名:" + c2getName());
//得到类名
Systemoutprintln("类名:" + c3getName());
//得到类名
}
}
//直接上例子代码import javalangreflectField;public class Test {
public final int a=5;
public static void main(String[] args) {
Test test = new Test();
try {
Field field = TestclassgetField("a");//指定要获取的字段名
//从Test对象中获取一个整形值;相应的也有getFloat()/getBoolean()等等方法。。详见JDK文档
Systemoutprintln(fieldgetInt(test));
//如果不能确定是什么数据类型可以返回一个Object
Object obj = fieldget(test);
Systemoutprintln(obj);
Systemoutprintln(objgetClass()getName());//获取对象的数据类型
} catch (Exception e) {
eprintStackTrace();
}
}
}
Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程就从实际应用的角度出发,来应用一下Java的反射机制。
反射基础
ps:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings="ziwenxie";
Class<>c=sgetClass();
通过forName方法
我们也可以调用Class类的静态方法forName:
Class<>c=ClassforName("javalangString");
使用class
或者我们也可以直接使用class:
Class<>c=Stringclass;
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfointerfacea包下面新建一个接口A:
packagetypeinfointerfacea;
publicinterfaceA{voidf();}
接着我们在typeinfopackageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
举个简单的例子吧,你有一套系统,根据不同版本连接多重不同的数据库,通过反射的方式,你可以通过传递一个字符串的方式来调用某个数据库连接类的方法。如果用set,get方法的话,每新增加一个数据库,就需要新增加一个方法,也就是说需要修改原有的已经写好的类。而使用反射,直接创建一个新的类,然后直接调用就可以了,无需修改任何原有的类。当然这个例子举的很菜鸟,希望你能理解。
试一试下面的内容:
public class ReflectTest{ / @param args / public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { / 下面是想用反射获取getNumber方法 / Student s = new Student(); Class c = sgetClass(); // Class[] cs = new Class[1]; // cs[0] = Stringclass; Method m = cgetDeclaredMethod("getNumber", Stringclass); Systemoutprintln(minvoke(new Student(), "123")); }}2另外,一般这个反射获得方法的方式是针对私有方法的,而不是公有方法。
以上就是关于java中反射的三种方法是全部的内容,包括:java中反射的三种方法是、JAVA反射Field、Java的反射机制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)