关于java反射的总结
2015-05-22 09:42
211 查看
1、反射的概念
a) 定义:反射就是把java类中的各个成分映射成相应的java类
b) 举例说明:
例如,一个java类用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等信息,也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机变速箱等等也是一个个的类,表示java类的Class类显然要提供一些列的方法来获得其中的变量、方法、构造方法、修饰符、包等信息,这些恶信息就是用相应累的实例对象来表示,它们是Field、Method、Constructor、Package。
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);//true sop(cls1==cls3);//true //判断是否是基本类型 sop(cls1.isPrimitive());//false sop(int.class.isPrimitive());//true sop(int.class==Integer.class);//false sop(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-->a changeStringValue(pt1); System.out.println(pt1); } public static void changeStringValue(Object obj)throws Exception { //获取对象中所有变量 Field[] fields =obj.getClass().getFields(); //判断Field中的成员是否是字符串,如果是就将b替换成a for(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()); } }
-
相关文章推荐
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- Java基础知识 十七 (关于反射一些方法的总结)
- 关于java重的反射的总结。
- 关于Java反射机制的总结
- [置顶] 知识总结之 插件化基础 java反射与代理
- 关于java web中session的一些注意事项与总结
- Java中关于关键字new创建字符串对象的总结
- Java关于Properties用法的总结(一)
- 关于java分布式思想的一些总结--------业务分析
- 第十三天 :关于java中垃圾回收机制的总结
- Java中反射技术总结
- 你需要理解的 Java 反射机制知识总结
- 关于java和web工程项目中各种路径的获取总结
- 关于Java中反射的认识
- java反射基础知识总结
- 【详细】关于Java中的反射
- 关于Java double取值范围及Double的MAX_VALUE和MIN_VALUE的总结
- 关于Java中常用的集合类总结
- 关于牛客网的JAVA面试题错题总结以及归纳(1)
- 关于Java空指针异常的几种情况的总结(java.lang.NullPointerException)