反射基础

反射常用方法

1.反射器获取属性,方法和构造器

public class Test {

	public static void main(String[] args) throws Exception{
		 test1();//反射获取属性
		//test2();// 反射获取属性
		//test4();//反射获取属性
//		test5();
		//test3();//构造器
	}

	public static void test3() throws ClassNotFoundException, NoSuchMethodException, SecurityException,
			InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Class clazz = Class.forName("com.buleize.reflectreview.Person");
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor c : constructors) {
			System.out.println(c);
		}
		System.out.println("************");
		Constructor constructor = clazz.getConstructor();
		System.out.println(constructor);

		System.out.println("*****************");
		Constructor[] constructors1 = clazz.getDeclaredConstructors();
		for (Constructor c : constructors1) {
			System.out.println(c);
		}

		System.out.println("***********");
		Constructor constructor1 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
		constructor1.setAccessible(true);
		System.out.println(constructor1);

		Object obj = constructor1.newInstance("张安", 22, "男");
		System.out.println(obj);

	}
	
	public static void test5() {
		try {
			//Class clazz = Class.forName("com.buleize.reflectreview.Person");
			Person p = new Person();
			Class clazz = p.getClass();
			Field[] fields = clazz.getDeclaredFields();
			for(Field f : fields) {
				String str = f.getName();
				System.out.println(str);
				
			}
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public static void test2()
			throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		// 第二种方法
		Person p = new Person();
		Class clazz = p.getClass();
		Field field = clazz.getField("name");
		field.setAccessible(true);
		Object obj = null;
		try {
			 obj = clazz.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		field.set(obj, "张三");
		//System.out.println(field.getName());
		System.out.println(field.get(p));
	}
	
	public static void test4() {
		try {
			//Class clazz = Class.forName("com.buleize.reflectreview.Person");
			Person p = new Person();
			Class clazz = p.getClass();
			Field[] fields = clazz.getDeclaredFields();
			for(Field f : fields) {
				System.out.println(f);
			}
			
			Field field = clazz.getField("name");
			field.setAccessible(true);
			field.set(p, "李四");
			System.out.println(Modifier.toString(field.getModifiers()));
			System.out.println(p);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public static void test1() throws NoSuchFieldException, SecurityException {
		// 第一种方法
		Class clazz = Person.class;
		// 这种只能获取父子类中的public 修饰的属性
		Field[] fields = clazz.getFields();
		for (Field f : fields) {
			System.out.println(f);
		}
		Field f= clazz.getDeclaredField("name");
		System.out.println(f);
		
		try {
			Object obj = clazz.newInstance();
			f.set(obj, "张三");
			System.out.println(obj);
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2.常用API

public class Test {

	public static void main(String[] args) {
		//test1();//获取属性的方法
		//test2();//获取构造方法;
		//test3();//获取方法
		test4();//
		int a =5;
		int b = ++a;
		System.out.println(a+"***" + b);
		
	}
	
	public static void test4() {
		try(FileReader fr = new FileReader("src/data.properties");
				){
			Properties p = new Properties();
			p.load(fr);
			String str = p.getProperty("name");
			System.out.println(str+"*******");
			Set<String> keys = p.stringPropertyNames();
			for(String key : keys) {
				System.out.println(key);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void test3() {
		try {
			Class clazz =Class.forName("com.buleize.reflecthree.Person");
			Method[] method = clazz.getMethods();//本类中的所有public方法含继承链上的
			Method m = clazz.getMethod("setName",String.class);//指定参数类型的构造方法
			//System.out.println(m);
			Method[] method1 = clazz.getDeclaredMethods();//本类中的所有方法	
			//String name, String sex, int age, double weight
			Method m2 = clazz.getDeclaredMethod("setName",String.class);//本类中的所有方法				
			m2.setAccessible(true);
//			Method m3 = clazz.getDeclaredMethod("setName");
//			m3.setAccessible(true);
			Object obj = clazz.newInstance();
//			m3.invoke(obj);
			m2.invoke(obj, "张三");
			System.out.println(obj);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void test2() {
		try {
			Class clazz =Class.forName("com.buleize.reflecthree.Person");
//			Constructor[] constructors = clazz.getConstructors();//本类种全部构造方法
//			Constructor constructor = clazz.getConstructor();//指定参数类型的构造方法
//			Constructor[] constructors1 = clazz.getDeclaredConstructors();//本类中全部构造方法
			//String name, String sex, int age, double weight
			Constructor constructor1 = clazz.getDeclaredConstructor(String.class,String.class,int.class,double.class);
			constructor1.setAccessible(true);
			Object obj = constructor1.newInstance("于漫漫","女",23,65.0);
			System.out.println(obj);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void test1() {
		try {
			Class clazz =Class.forName("com.buleize.reflecthree.Person");
//			Field[] fields = clazz.getFields();//第一种方法
//			Field field = clazz.getField("name");//第二种方法
			//前两种方法能获取父类子类的public属性
//			Field[] fields1 = clazz.getDeclaredFields();//第三种方法
			Field field1 = clazz.getDeclaredField("name");//最常用第四种方法
			System.out.println(field1);
			field1.setAccessible(true);
			Object obj = clazz.newInstance();
			field1.set(obj, "张三");
			System.out.println(obj);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值