JDK1.5的新特性(2):反射

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。

—————————————————————————————————————————————————————————————————————————

一、概述

在总结java基础的博客里有简单的写到反射,这里再来深入的理解。

1,定义

首先的问题是什么是反射?百度百科给出的定义是这样的:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

用我自己的话简而言之就是,程序运行时能操纵类的各种成分。

2,反射的基石–class类

java是完全面向对象的语言,在java中万物皆对象,比如男人和女人都可以属于Person类,那么众多的java类是不是也可以用一个类表示呢?

在java中就用一个名为Class的类来表示。

二,获取Class类的三种方式

a,类名.class

b,对象.getClass()

c,Class.forName("类名")

<div style="text-align: left;">public static void main(String[] args) throws ClassNotFoundException {</div>Date d = new Date();System.out.println(Date.class);\\a,类名.class <div style="text-align: left;">System.out.println(Class.forName("java.util.Date"));\\c,Class.forName("类名")</div>System.out.println(d.getClass());\\b,对象.getClass()<div style="text-align: left;">}</div>

三,获取构造方法

Constructor类代表某类中的一个构造方法。

a,得到某一个构造方法

Class clazz = Class.forName("java.lang.String");

Constructor con = clazz.getConstructor(byte[].class);//得到某一个构造函数

b,得到全部的构造方法

Constructor[] cons = clazz.getConstructors();//得到全部构造函数

四,创建实例对象

使用Constructor.newInstance()方法

1,步骤a,获取class类b,获取Gonstructor构造方法c,调用newInstance()方法.<div style="text-align: left;">//a,获取class类</div><div style="text-align: left;">Class clazz = Class.forName("jinfulin.b.bean"); </div>//b,获取Gonstructor构造方法<div style="text-align: left;">Constructor cons = clazz.getConstructor(String.class,int.class); </div>//c,调用newInstance()方法.<div style="text-align: left;">Object obj = cons.newInstance("sf",21); </div>

2,对于无参数构造函数可以简写,但是从底层调用上来看本质是一样的.<div style="text-align: left;"> Class clazz = Class.forName("jinfulin.p.bean.Person"); </div><div style="text-align: left;">Object obj = clazz.newInstance();//创建一个新的无参的实例 </div>

五、成员变量的反射1,方法

Field getField(String s);//只能获取公有和父类中公有

Field getDeclaredField(String s);//获取该类中所有的成员变量,包括私有

setAccessible(true);//对私有字段的访问取消权限检查。暴力访问。

2,举例<div style="text-align: left;">//获取字段(属性)</div><div style="text-align: left;">PointDemo pd = new PointDemo(3,2);</div><div style="text-align: left;">Field field1 = pd.getClass().getField("x");</div>Object o1 = field1.get(pd);<div style="text-align: left;">System.out.println(o1);</div>//field1.set(o1, 12);<div style="text-align: left;">Field field2 = cls2.getDeclaredField("y");</div>Object o2 = cls2.newInstance();<div style="text-align: left;">//Constructor con2 = cls2.getConstructor(int.class,int.class);</div>field2.setAccessible(true);//暴力反射field2.set(o2, 12);<div style="text-align: left;">System.out.println(field2.get(o2));</div>

3,高级应用举例

–运用反射,将PointDemo类中的字符串中的所有字符替b换为a.

<div style="text-align: left;">/**</div><div style="text-align: left;"> * 运用反射,将PointDemo类中的字符串中的某一个字符替换掉.</div> * @throws Exception */<div style="text-align: left;">private static void changeStringValue() throws Exception {</div>Class cls = Class.forName("cn.jinfulin.day1.Reflect.PointDemo");<div style="text-align: left;">for(Field field : fields){</div>Object obj = cls.newInstance();Field[] fields = cls.getFields();<div style="text-align: left;">String newString = oldString.replace('b', 'a');</div>if(field.getType() == String.class){String oldString = (String) field.get(obj);<div style="text-align: left;">}</div>field.set(obj, newString);}}<div style="text-align: left;">System.out.println(obj);</div>

六、成员方法的反射

1,方法

Method[] getMethods();//只获取公有的和父类中的方法。

Method[] getDeclaredMethods();//获取本类中包含私有。

Method getMethod("方法名",参数.class);

Object invoke(Object obj ,参数);//调用方法

如果方法是静态,invoke方法中的对象参数可以为null。

但是至少可以为自己的荷包省钱可以支些招,这点还是很现实的。

JDK1.5的新特性(2):反射

相关文章:

你感兴趣的文章:

标签云: