黑马程序员——反射:把java类中的各种成分映射为相应的java类

 ------- <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>、期待与您交流! ----------


猜你喜欢

转载自blog.csdn.net/a1106900429/article/details/40025125