您的位置:首页 > 编程语言 > Java开发

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路径名(包名+类名)");

注:

①一份字节码文件已经加载到内存中区了,找到字节码文件并返回

②字节码不存在,用类加载器去加载,缓存后到虚拟机并返回

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: