------- <a href="http://www.itheima.com" target="blank">android培训</a>
代码演示:
import java.lang.reflect.*;
/*
* 反射:把java类中的各种成分映射为相应的java类
* */
public class ReflectTest {
public static void main(String[] args)throws Exception{
// TODO Auto-generated method stub
String s = "abc";
//获取字节码的三种方法
Class cls1 = String.class; //类名获取
Class cls2 = s.getClass(); //对象方法获取
Class cls3 = Class.forName("java.lang.String"); //静态方法获取
System.out.println(cls1);
System.out.println(cls2);
System.out.println(cls3);
//都是同一个字节码
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);
//判断是否是九个基本类型字节码
System.out.println(cls1.isPrimitive());
System.out.println(int.class == Integer.class);
System.out.println(int.class == Integer.TYPE);
System.out.println(int[].class.isPrimitive());
constructorClass();
fieldClass();
methodClass();
mainReflect(args[0]);
arrayReflect();
}
/*
* 反射相关类: Method 类表示得到类中的某个方法
* */
private static void methodClass() throws Exception{
String str = "efg";
//获得指定函数方法
Method methods = str.getClass().getMethod("charAt", int.class);
//调用函数
System.out.println(methods.invoke(str, 2));
//jdk 1.5 以前的调用 用数组代表可变参数
System.out.println(methods.invoke(str, new Object[]{0}));
}
/*
* 反射相关类: Constructor 类代表某个类中的一个构造方法
* 得到某个类的构造方法
* //得到类中的全部构造函数
* Constructor[] constructors =
* Class.forName("java.lang.String").getConstructors();
* //得到指定参数的构造函数
* Constructor constructors =
* Class.forName("java.lang.String").getConstructor(StringBuffer.class);
* 创建实例对象:
* //创建指定参数的实例对象
* String s = (String)constructors.newInstance(new StringBuffer("abc"));
*
* Class.newInstance()方法:创建该类默认构造函数的实例对象
* String s = (String)class.forName("java.lang.String").newInstance();
* 注意:该方法内部实现用到了缓存机制来保存 默认的构造方法的实例对象。
* */
public static void constructorClass()throws Exception{
//用反射机制来创建一个new String(new StringBuffer("abc"))对象
//获取一个构造函数
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
//用构造函数获取一个对象
String s = (String)constructor.newInstance(new StringBuffer("abc"));
System.out.println(s.charAt(2));
//用反射创建一个默认的构造函数
StringBuffer sb = (StringBuffer)Class.forName("java.lang.StringBuffer").newInstance();
sb.append("dafdafwe");
System.out.println(sb);
}
/*
* 反射相关类: Field 类代表取出对象中变量的值
* */
public static void fieldClass() throws Exception{
ReflectPoint rp = new ReflectPoint(5, 10);
//获取类的成员y字段
Field fieldY = rp.getClass().getField("y");
//打印对象成员y的值
System.out.println(fieldY.get(rp));
//暴力反射获取私有变量的值
Field fieldX = rp.getClass().getDeclaredField("x");
fieldX.setAccessible(true);
System.out.println(fieldX.get(rp));
fieldShow(rp);
System.out.println(rp.toString());
}
/*
* 练习: 修改类中的成员变量中的字符串中的字符‘a’为‘b’
* */
private static void fieldShow(ReflectPoint rp) throws Exception{
//获取类中的成员字段
Field[] fields = rp.getClass().getFields();
//System.out.println(fields.length);
//迭代数组
for(Field field : fields){
//判断是否为String类型
if(field.getType() == String.class){
String s = (String)field.get(rp);
String news = s.replace('b', 'a');
//将对象中的成员替换
field.set(rp, news);
}
}
}
/*
* 用反射来调用main方法
* */
public static void mainReflect(String str) throws Exception{
//传统调用main方法
//ReflectMain.main(new String[]{"aaa", "bbb", "ccc"});
//用反射来调用main方法,当不知道类名的时候适合用
String startingClassName = str;
//指定函数名和参数类型获取方法
Method method = Class.forName(startingClassName).getMethod("main", String[].class);
method.invoke(null, new Object[]{new String[]{"你好", "呵呵", "你们好"}}); //注意JDK1.5的自动拆封装要封装成对象
}
/*
* 利用数组的反射来打印数组中的元素
* */
public static void arrayReflect(){
int[] a = new int[]{1, 3, 5};
int[][] b = new int[][]{new int[]{5, 10, 30}, new int[]{15, 20}};
String[] str = new String[]{"aaa", "bbb", "ccc"};
arrayPrint(str);
}
/*
* 反射在数组中的应用
* */
public static void arrayPrint(Object obj){
if(obj.getClass().isArray()){
int len = Array.getLength(obj);
for(int i=0; i<len; i++){
System.out.println(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}
}
class ReflectMain{
public static void main(String []args){
System.out.println(args.length);
for(int i=0; i<args.length; i++){
System.out.println(args[i]);
}
}
}
<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------