先说一下反射的定义,java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。目前反射机制也是java语言独有的。

方法中setAccessible(true);的意思是允许调用私有的构造方法,所以在一些使用单例模式的程序中要注意防范这种反射的攻击。

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能够调用它的任意一个方法,这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能,在运行时判定任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判定任意一个类所具有的成员变量和方法,在运行是调用任意一个对象的方法,生成多态代理。

package com.lesson.java;
 /**• 学生类
• @author Think
• 
*/
public class Student{
private Integer age = 16;//私有封装年龄

public String name = "13";//名字
/**
 * 无参的构造函数
 */
public Student(){}
/**
 * 有参的构造函数
 */
public Student(Integer age,String name){
	this.age=age;
	this.name=name;
}

public Integer getAge() {
	return age;
}

public void setAge(Integer age) {
	
	this.age = age;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public void name1() {
	
	System.out.println("名字:"+getName()+"年龄:"+getAge());
	
	System.out.println("java反射成功!");
}

private void show() {
	
	System.out.println("私有的方法");
}

}

package com.lesson.java;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

public class Test {

// 将异常全部抛出
public static void main(String[] args)
		throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,
		IllegalArgumentException, InvocationTargetException, NoSuchFieldException, IllegalAccessException {

	Scanner input=new Scanner(System.in);
	
	System.out.println("请输入你要解绑的类");
	
	String nameString=input.next();
	// 创建一个class对象
	Class<?> aclass = Class.forName(nameString);// 包名加类名

	// 创建方法对象
	Method method1 = aclass.getDeclaredMethod("name1");
	
	
	Method method2=aclass.getDeclaredMethod("show");
	
	// 通过newInstance方法转换
	// 需要转成object对象,因为在运行时不可以运行aclass
	Object obj1 = aclass.newInstance();
	
	Object obj2=aclass.newInstance();
	
	//解除私有的方法
	method2.setAccessible(true);
	// 再通过方法名点invoke方法输出
	method1.invoke(obj1);
	
	method2.invoke(obj2);

	// 获取方法的方法和获取字段的方法是分开的
	// 输出公有字段直接输出
	Field field = aclass.getField("name");
	// 私有字段需要解开封装

	Field fi = aclass.getDeclaredField("age");

	fi.setAccessible(true);// 解开封装需要的方法

	System.out.println(fi.get(obj1));

	System.out.println(field.get(obj1));
	
	


}
}
package com.lesson.java;
import java.lang.reflect.Constructor;
//import java.lang.reflect.Field;
/**
• 反射测试类
• 
• @author Think
• 
*/
 public class TextReflect {
public static void main(String[] args) throws Exception {
	
	
	
	try {
		
		// 类创建好后,在测试类中可以使用Class.forName("类的路径名");

		// 来创建学生对象,输出学生对象的姓名和年龄
		Class<?> cls = Class.forName("com.lesson.java.Student");

		// 也可以通过使用getConstructor方法得到构造对象Constructor,然后通过constructor.newInstance();方法得到对象

		Constructor<?> constructor = cls.getConstructor(Integer.class, String.class);
		
		
		 //将上面获取到的对象用obj保存起来
		
		Object obj = constructor.newInstance(20, "小明");

		
		if (obj instanceof Student) {
			
			//强转
			Student stu = (Student) obj;

			stu.setAge(10);

			stu.setName("小明");

			stu.name1();

			System.out.println("姓名是:" + stu.getName() + ",年龄是" + stu.getAge());

		}

	} catch (Exception e) {

		System.out.println(e.getMessage());
		
	}

}