源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

java反射机制实战示例分享

  • 时间:2021-06-10 23:21 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:java反射机制实战示例分享
首先,我们来认识几个类。 Class(java.lang.Class) Class对象是一个特殊对象,每一个类都有一个Class对象,用来创建该类的“常规”对象。可以通过对象的getClass()方法获取。 比如我们运行这一行代码:
[u]复制代码[/u] 代码如下:
System.out.println("测试".getClass().toString());
得到的结果就是:
[u]复制代码[/u] 代码如下:
class java.lang.String Field(java.lang.reflect.Field)
这个类表示一个字段,可以使用这个字段来访问类 下面,我们来创建测试类:
[u]复制代码[/u] 代码如下:
class Book {     public String title;     public int length = 0;     public ArrayList<Page> pages = null;     @Override     public String toString() {         String sb = "Book:\n";         sb += "title="+title+"\n";         sb += "length=" + length + "\n";         sb += "pages=" + pages + "\n";         if (pages != null) {             for (Page page : pages) {                 sb += page.toString();             }         }         return sb.toString();     } } class Page {     @Override     public String toString() {         return "page\n";     } }
调用以下方法来测试上面的类:
[u]复制代码[/u] 代码如下:
Book book = new Book(); System.out.println(book);
它的结果是这样:
[u]复制代码[/u] 代码如下:
Book: title=null length=0 pages=null
这是book对象的初始状态 我们下面通过反射机制,获取book对象中的length字段并进行修改,查看结果:
[u]复制代码[/u] 代码如下:
Book book = new Book(); Class<?> aClass = book.getClass(); Field field = aClass.getField("length"); field.setInt(book, 9); System.out.println(book);
可以看到运行结果是:
[u]复制代码[/u] 代码如下:
Book: title=null length=9 pages=null
可以看出,length字段的值已经被修改了。 上面修改的是int型的简单字段,事实上像title字段这样的对象字段也是可以修改的,下面是示例:
[u]复制代码[/u] 代码如下:
Book book = new Book(); Class<?> aClass = book.getClass(); Field[] fields = aClass.getFields(); for (Field field : fields) {     field.setAccessible(true);     if(field.getType().equals(String.class)){         field.set(book, "格林童话");     }else if(field.getType().equals(int.class)){         field.set(book, 199);     } } System.out.println(book);
上面的代码输出结果是:
[u]复制代码[/u] 代码如下:
Book: title=格林童话 length=199 pages=null
事实上,是将所有String类型的字段都修改成“格林童话”,将所有int类型字段都修改成199 。我们甚至根本不知道这个字段代表什么意思。 下面,我们对pages这个字段进行修改。这个字段是个ArrayList,我们将创建一个ArrayList对象,并向其中插入一个对象。
[u]复制代码[/u] 代码如下:
Book book = new Book(); Class<?> aClass = book.getClass(); Field[] fields = aClass.getFields(); for (Field field : fields) {     field.setAccessible(true);     if(field.getType().equals(ArrayList.class)){         String genric = field.getGenericType().toString();         String genricClass = genric.substring(                             genric.indexOf('<') + 1,                             genric.indexOf('>'));         Class<?> entityClass = Class.forName(genricClass);         Object obj = entityClass.newInstance();         ArrayList list = new ArrayList();         list.add(obj);         field.set(book, list);         }     } System.out.println(book);
输出结果如下:
[u]复制代码[/u] 代码如下:
Book: title=null length=0 pages=[page ] Page
可以看出,尽管我们根本没有直接使用Page类,但还是创建出了一个Page对象。 Page对象的创建语句在:entityClass.newInstance()这一句。newInstance语句是Class对象的重要方法,用来创建这个类对应的对象。当然,需要类的构造方法支持。另外,通过genGenericType方法,我们可以获取到字段的类型修饰符。放在这里,获取到的就是ArrayList<Page>。有了这一个字符串,我们就可以通过类加载器Class.forName来加载Page类并创建一个Page对象了。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部