java反射的初步练习
2015-04-22 18:03
357 查看
反射的应用范围
编写框架,和复用很高的程序。
反射的初步理解
java程序中的java类属于同于类事物, 描述这一类事物的java类名就是Class,
通过Class类就可以获取这个类的各种信息 一个java类代表一份字节码文件,
每一份字节码文件就是一个 Class实体对象
Class对象的三种获取方式
Class对象的1三种获取方式
(1)类名.class
(2)对象名.getClass
(3)Class.forName("完整的java路径名(包名+类名)");
注:
①一份字节码文件已经加载到内存中区了,找到字节码文件并返回
②字节码不存在,用类加载器去加载,缓存后到虚拟机并返回
数组的反射练习
编写框架,和复用很高的程序。
反射的初步理解
java程序中的java类属于同于类事物, 描述这一类事物的java类名就是Class,
通过Class类就可以获取这个类的各种信息 一个java类代表一份字节码文件,
每一份字节码文件就是一个 Class实体对象
Class对象的三种获取方式
Class对象的1三种获取方式
(1)类名.class
(2)对象名.getClass
(3)Class.forName("完整的java路径名(包名+类名)");
注:
①一份字节码文件已经加载到内存中区了,找到字节码文件并返回
②字节码不存在,用类加载器去加载,缓存后到虚拟机并返回
<span style="font-size:24px;">public class Class_Demo01 { public static void main(String[] args) throws Exception { String s1="今天是个好天气"; String s2="哈哈哈"; <span style="color:#33cc00;">//三种获取方式</span> Class c1=s1.getClass(); Class c2=String.class; Class c3 =Class.forName("java.lang.String");<span style="color:#33cc00;">//此处会有异常,因为你不能保证你的完整类名一定正确</span> <span style="color:#33cc00;">//判读是否是同一份字节码文件</span> System.out.println(c1==c2); System.out.println(c1==c3); <span style="color:#33cc00;">//判读是否是基本类型</span> System.out.println(c1.isPrimitive()); <span style="color:#33cc00;"> //判读是否是数组类型</span> System.out.println(int[].class.isArray() ); } }</span>反射获取----构造方法Constructor
<span style="font-size:24px;">public static void demo_Counstructor() throws Exception { <span style="color:#009900;">// 获取所有的构造方法</span> Constructor[] constructor = Class.forName("java.lang.String") .getConstructors(); <span style="color:#33cc00;">// 获取指定的构造方法-------获取String类中的 String(StringBuilder str) 的这种构造</span> Constructor con = String.class.getConstructor(StringBuilder.class);<span style="color:#33cc00;">// :这里的StringBuilder是指选择了String内中一个参数为StringBuilder的构造方法</span> String s =(String) con.newInstance(new StringBuilder("哈哈是个好天气"));<span style="color:#33cc00;">//这里的StringBuilder是指用这个构造方法创建对象时,需要传递一个StringBuider的对象</span> System.out.println(s.charAt(2)); <span style="color:#33cc00;">//用Class.newInstance获取对象的默认的构造方法 </span> String s2 = (String)Class.forName("java.lang.String").newInstance(); System.out.println(s2==null); }</span><span style="font-size:18px;font-weight: bold;"> </span>反射获取------成员变量Field
<span style="font-size:24px;">public static void demo_Field() throws Exception{ Fs_Demo fs=new Fs_Demo(5, "哈哈"); Field f1=fs.getClass().getField("a");<span style="color:#33cc00;">//f1不代表具体的值</span> <span style="color:#33cc00;">//f1不是对象身上的变量,而是类上,要用它去取某个对象上对应的值 //获取值</span> System.out.println(f1.get(fs)); Field f2=fs.getClass().getDeclaredField("name");<span style="color:#33cc00;">//强制获取可见和不可见(private)的成员</span> f2.setAccessible(true);<span style="color:#33cc00;">//强制设置可访问</span> System.out.println(f2.get(fs)); }</span>反射获取---成员方法Method
<span style="font-size:24px;">public static void demo_Method() throws Exception{ String s="方法是个好好的"; Method method=String.class.getMethod("charAt", int.class);<span style="color:#33cc00;">//参数一:方法名 ; 参数二:因为每一种方法都有多种重载形式 //所以需要用这个方法的参数.class 来明确这个方法</span> <span style="color:#33cc00;">//String.class.getDeclaredMethod(name, parameterTypes)//获取所有的方法,包括私有</span> System.out.println(method.invoke(s, 2));<span style="color:#33cc00;">//调用方法 //method.invoke(s, 2) 当第一个参数为null时,那么代表method对象对应的是一个静态方法</span> }</span>反射练习
<span style="font-size:24px;">package 反射基础; import java.lang.reflect.Field; public class Class_Demo03_Field01 { <span style="color:#33cc00;">/** * 要求:利用反射将字符串中含有b的改成a * @throws Exception * @throws */</span> public static void main(String[] args) throws Exception { Fs_Demo f=new Fs_Demo(5, "哈哈"); <span style="color:#33cc00;">//第一步获取所有的字段</span> Field [] fields=f.getClass().getFields(); for (Field field : fields) { <span style="color:#33cc00;">//field.getType().equals(String.class); //因为字节码文件只有一份,建议在比较字节码时用==比较好</span> if (field.getType()==String.class) { String sValue =(String)field.get(f);<span style="color:#33cc00;">//获取</span> System.out.println(sValue); sValue=sValue.replace("b", "a");<span style="color:#33cc00;">//替换 </span> System.out.println(sValue); } } } }</span>
<span style="font-size:24px;">package 反射基础; public class Fs_Demo { public int a; private String name; public String string="bdsbdsbbsbabsa"; public String string2="bkdlflsklfb"; public Fs_Demo(int a, String name) { super(); this.a = a; this.name = name; } }</span><strong style="font-size:18px;"> </strong>
数组的反射练习
<span style="font-size:24px;">package 反射基础; import java.lang.reflect.Array; public class Class_Demo04 { <span style="color:#33cc00;">/** * 数组的反射练习 注:具有相同的维度且又具有相同的元素类型是同一种类型 * */</span> public static void main(String[] args) { int[] a1 = new int[] { 5, 6, 8, 4 }; int[] a2 = new int[4]; int[][] a3 = new int[2][3]; String[] s = new String[4]; System.out.println(a1.getClass() == a2.getClass());<span style="color:#33cc00;">// 判读两个数组的字节码是否是同一类型</span> <span style="color:#33cc00;">/* * System.out.println(a1.getClass()==a3.getClass());//编译出错:不兼容的操作数类型类<捕获# * //3吗?扩展int[]类>和<捕捉# 4 ?扩展int[][]> * System.out.println(a1.getClass()==s.getClass()); */ // 是同一个父类</span> System.out.println(a1.getClass().getSuperclass().getName());<span style="color:#33cc00;">// 父类</span> System.out.println(a3.getClass().getSuperclass().getName()); printObject(a1); printObject("sdfsgfd"); } <span style="color:#33cc00;">// 功能:打印数组</span> public static void printObject(Object obj) { Class c = obj.getClass(); if (c.isArray()) {<span style="color:#33cc00;">// 是数组</span> int len = Array.getLength(obj);<span style="color:#33cc00;">// 获取数组长度</span> for (int i = 0; i < len; i++) { System.out.println(Array.get(obj, i));<span style="color:#33cc00;">// 取出元素</span> } } else { System.out.println(obj); } } }</span><strong style="font-size:18px;"> </strong>
相关文章推荐
- java反射小练习
- java 反射机制 Demo 练习
- java注解和反射制作dao基类的练习
- java反射练习02
- JAVA 反射练习
- 0034 Java学习笔记-反射-初步2-操作对象
- Java反射初步学习
- java反射练习
- java 反射初步理解
- java反射初步学习(一)
- java反射初级练习
- Java 反射机制 练习代码
- java反射练习
- java反射初步了解
- Java菜鸟教程 插入排序初步和几个有趣的练习
- java注解和反射制作dao基类的练习
- Java反射初步
- Java 静态加载类与动态加载类(初步认识Java的反射)
- Java的Reflect反射基础API练习
- JAVA反射之Class类的练习