关于java反射的总结

来源:互联网 发布:php 转发http请求 编辑:程序博客网 时间:2024/06/06 10:24


 

1、反射的概念

a) 定义:反射就是把java类中的各个成分映射成相应的java

b) 举例说明:

例如,一个java类用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等信息,也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机变速箱等等也是一个个的类,表示java类的Class类显然要提供一些列的方法来获得其中的变量、方法、构造方法、修饰符、包等信息,这些恶信息就是用相应累的实例对象来表示,它们是FieldMethodConstructorPackage

2、Class

反射类的基石---Class

Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class

对比提问:众多的人用一个什么类表示?人。

众多的java类用一个什么类表示?Class

对比提问:Person类代表人,它的实例对象就是张三、李四这样一个个人。

     Class类代表java类、它的各个实例对象又分别代表什么?

对应各个类在内存中的字节码。

                例如:Person类的字节码,ArrayList类的字节码,一个类被类加载器加 载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码, 不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个 的空间可分别用一个个对象来表示。

如何得到各个字节码对应的实例对象(Class类型)?

(1)类名.class 例:System.class

(2)对象.getClass() 例:new Data().getClass();

(3)Class.forName(“类名”) 例:Class.forName(“java.util.Date”);

 代码示例:

 

package reflect;public class ReflectTest {/** * @param args */public static void main(String[] args)throws Exception{//定义一个字符串String str1="abc";//通过三种方式获取各个字节码对应的实例对象Class cls1=str1.getClass();Class cls2=String.class;Class cls3=Class.forName("java.lang.String");//判断各个字节码受否相同sop(cls1==cls2);//truesop(cls1==cls3);//true//判断是否是基本类型sop(cls1.isPrimitive());//falsesop(int.class.isPrimitive());//truesop(int.class==Integer.class);//falsesop(int.class==Integer.TYPE);//true}private static void sop(Object obj) {System.out.println(obj);}}

3、Constructor

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

b) 代码示例:

 

package reflect;import java.lang.reflect.Constructor;public class ConstructorDemo {/** * @param args */public static void main(String[] args) throws Exception{//new String(new StringBuffer("abc"));Constructor con1=String.class.getConstructor(StringBuffer.class);String str2=(String)con1.newInstance(new StringBuffer("abc"));System.out.println(str2.charAt(2));//得到某个类所有的构造方法Constructor[] constructors=Class.forName("java.lang.String").getConstructors();//创造某一个构造方法Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);//获取方式时用到类型//创建实例对象//通常方式:String str=new String(new StringBuffer("abc"))//反射方式:String str=(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象Class.newInstatce()方法System.out.println(str.charAt(1));}}

4、Field

a) Fiedl类代表某个类中的一个成员变量

b) 代码示例

package reflect;import java.lang.reflect.Field;public class FiledDemo {/** * @param args */public static void main(String[] args) throws Exception{ReflectPoint pt1=new ReflectPoint(3,5);Field fieldY=pt1.getClass().getField("y");sop(fieldY.get(pt1));Field fieldX=pt1.getClass().getDeclaredField("x");fieldX.setAccessible(true);sop(fieldX.get(pt1));}private static void sop(Object object) {System.out.println(object);}}


5、Method

a) Method类代表某个类中的一个成员方法得到类中的某一个方法

b) 代码示例

 

package reflect;import java.lang.reflect.Method;public class MethodDemo {/** * @param args * @throws ClassNotFoundException  * @throws NoSuchMethodException  * @throws SecurityException  */public static void main(String[] args) throws Exception{/*调用方法:通常方法:sop(Str.charAt(1));反射方法:sop(charAt.invoke(str,1));*/String str="osnfosfns";Method methodCharAt=Class.forName("java.lang.String").getMethod("charAt", int.class);System.out.println(methodCharAt.invoke(str,1));System.out.println(methodCharAt.invoke(str, new Object[]{0}));}}

6、数组的反射

代码示例

package reflect;import java.lang.reflect.Array;import java.util.Arrays;public class ArrayDemo {/** * @param args */public static void main(String[] args) {int [] a1=new int[3];int [] a2=new int[4];int [][] a3=new int[2][3];String[] a4=new String[]{"3","nsfosn","nfos"};//sop(a1.getClass()==a2.getClass());//sop(a1.getClass()==a3.getClass());Object obj1=a1;Object obj2=a2;Object obj3=a3;Object obj4=a4;//sop(obj1);//sop(obj2);//sop(obj3);//sop(obj4);//sop(Arrays.asList(a1));//sop(Arrays.asList(a4));printObject(a1);printObject(a4);}private static void printObject(Object obj){Class clazz=obj.getClass();if(clazz.isArray()){int len=Array.getLength(obj);for(int i=0;i<len;i++){sop(Array.get(obj, i));}}else {sop(obj);}}public static void sop(Object obj){System.out.println(obj);}}

7、实现将字符串中的a换成b

代码实现:

package reflect;import java.lang.reflect.Field;public class ChangeBToAByField {/** * @param args */public static void main(String[] args) throws Exception{//定义一个实例对象ReflectPoint pt1=new ReflectPoint(3,5);System.out.println(pt1);//改变字符串中的值,b-->achangeStringValue(pt1);System.out.println(pt1);}public static void changeStringValue(Object obj)throws Exception{//获取对象中所有变量Field[] fields =obj.getClass().getFields();//判断Field中的成员是否是字符串,如果是就将b替换成afor(Field field:fields){if(field.getType()==String.class){String oldValue=(String)field.get(obj);String newValue=oldValue.replace('b', 'a');field.set(obj, newValue);}}}}


8、实例:用反射实现简单的框架

代码实现:

package reflect;import java.io.FileInputStream;import java.io.InputStream;import java.util.Collection;import java.util.Properties;public class ReflectProperties {/** * @param args */public static void main(String[] args) throws Exception{InputStream ips=new FileInputStream("file\\config.properties");Properties props=new Properties();props.load(ips);ips.close();String ClassName=props.getProperty("className");Collection collections=(Collection)Class.forName(ClassName).newInstance();ReflectPoint pt1=new ReflectPoint(3,3);ReflectPoint pt2=new ReflectPoint(3,3);ReflectPoint pt3=new ReflectPoint(3,44);ReflectPoint pt4=new ReflectPoint(3,55);collections.add(pt1);collections.add(pt1);collections.add(pt3);collections.add(pt4);System.out.println(collections.size());}}


-

 

 

 

 

 

 

 

0 0
原创粉丝点击