public class BigStar implements Star {
			private String name;


			public BigStar() {
			}

			public BigStar(String name) {
				this.name = name;
			}

			//唱歌
			@Override
			public String sing(String name){
				System.out.println(this.name + "正在唱" + name);
				return "谢谢";
			}

			//跳舞
			@Override
			public void dance(){
				System.out.println(this.name + "正在跳舞");
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			public String toString() {
				return "BigStar{name = " + name + "}";
			}
			}
				
			
				
			import java.lang.reflect.InvocationHandler;
			import java.lang.reflect.Method;
			import java.lang.reflect.Proxy;

			/*
			*
			* 类的作用:
			*       创建一个代理
			*
			* */
			public class ProxyUtil {


				/*
				*
				* 方法的作用:
				*       给一个明星的对象,创建一个代理
				*
				*  形参:
				*       被代理的明星对象
				*
				*  返回值:
				*       给明星创建的代理
				*
				*
				*
				* 需求:
				*   外面的人想要大明星唱一首歌
				*   1. 获取代理的对象
				*      代理对象 = ProxyUtil.createProxy(大明星的对象);
				*   2. 再调用代理的唱歌方法
				*      代理对象.唱歌的方法("只因你太美");
				* */
				public static Star createProxy(BigStar bigStar){
				   /* java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

				public static Object newProxyInstance(ClassLoader loader, Class尖括号?>[] interfaces, InvocationHandler h)
				参数一:用于指定用哪个类加载器,去加载生成的代理类
				参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
				参数三:用来指定生成的代理对象要干什么事情*/
				Star star = (Star) Proxy.newProxyInstance(
						ProxyUtil.class.getClassLoader(),//参数一:用于指定用哪个类加载器,去加载生成的代理类
						new Class[]{Star.class},//参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
						//参数三:用来指定生成的代理对象要干什么事情
						new InvocationHandler() {
							@Override
							public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
								/*
								* 参数一:代理的对象
								* 参数二:要运行的方法 sing
								* 参数三:调用sing方法时,传递的实参
								* */
								if("sing".equals(method.getName())){
									System.out.println("准备话筒,收钱");
								}else if("dance".equals(method.getName())){
									System.out.println("准备场地,收钱");
								}
								//去找大明星开始唱歌或者跳舞
								//代码的表现形式:调用大明星里面唱歌或者跳舞的方法
								return method.invoke(bigStar,args);
							}
						}
				);
				return star;

			}
			}
				
			
				
			public interface Star {

			//我们可以把所有想要被代理的方法定义在接口当中

			//唱歌
			public abstract String sing(String name);

			//跳舞
			public abstract void dance();

			}
				
			
				
			public class Test {
			public static void main(String[] args) {



			/*
			需求:
				外面的人想要大明星唱一首歌
				 1. 获取代理的对象
					代理对象 = ProxyUtil.createProxy(大明星的对象);
				 2. 再调用代理的唱歌方法
					代理对象.唱歌的方法("只因你太美");
			*/


			//1. 获取代理的对象
			BigStar bigStar = new BigStar("鸡哥");
			Star proxy = ProxyUtil.createProxy(bigStar);

			//2. 调用唱歌的方法
			String result = proxy.sing("只因你太美");
			System.out.println(result);

			}
			}
				
			
				
			public class MyReflectDemo1 {
			public static void main(String[] args) throws ClassNotFoundException {

			/*
			* 获取class对象的三种方式:
			*   1. Class.forName("全类名");
			*   2. 类名.class
			*   3. 对象.getClass();
			*
			* */


			//1. 第一种方式
			//全类名 : 包名 + 类名
			//最为常用的
			Class clazz1 = Class.forName("com.itheima.myreflect1.Student");

			//2. 第二种方式
			//一般更多的是当做参数进行传递
			Class clazz2 = Student.class;


		   //3.第三种方式
			//当我们已经有了这个类的对象时,才可以使用。
			Student s = new Student();
			Class clazz3 = s.getClass();

			System.out.println(clazz1 == clazz2);
			System.out.println(clazz2 == clazz3);


			}
			}
				
			
				
			public class Student {
			private String name;
			private int age;

			public Student() {
			}

			public Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + "}";
			}
			}
				
			
				
			import java.lang.reflect.Constructor;
			import java.lang.reflect.InvocationTargetException;

			public class MyReflectDemo {
				public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
			/*
			Class类中用于获取构造方法的方法
				Constructor[] getConstructors()                                返回所有公共构造方法对象的数组
				Constructor[] getDeclaredConstructors()                        返回所有构造方法对象的数组
				Constructor getConstructor(Class... parameterTypes)         返回单个公共构造方法对象
				Constructor getDeclaredConstructor(Class... parameterTypes) 返回单个构造方法对象


			Constructor类中用于创建对象的方法
				T newInstance(Object... initargs)                                 根据指定的构造方法创建对象
				setAccessible(boolean flag)                                       设置为true,表示取消访问检查
			*/

			//1.获取class字节码文件对象
			Class clazz = Class.forName("com.itheima.myreflect2.Student");

			//2.获取构造方法
		   /* Constructor[] cons1 = clazz.getConstructors();
			for (Constructor con : cons1) {
				System.out.println(con);
			}
			Constructor[] cons2 = clazz.getDeclaredConstructors();
			for (Constructor con : cons2) {
				System.out.println(con);
			}*/


		   /* Constructor con1 = clazz.getDeclaredConstructor();
			System.out.println(con1);

			Constructor con2 = clazz.getDeclaredConstructor(String.class);
			System.out.println(con2);

			Constructor con3 = clazz.getDeclaredConstructor(int.class);
			System.out.println(con3);*/

			Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);
			/*
			int modifiers = con4.getModifiers();
			System.out.println(modifiers);


			Parameter[] parameters = con4.getParameters();
			for (Parameter parameter : parameters) {
				System.out.println(parameter);
			}*/

			//暴力反射:表示临时取消权限校验
			con4.setAccessible(true);
			Student stu = (Student) con4.newInstance("张三", 23);

			System.out.println(stu);


			}
			}
				
			
				
			public class Student {
			private String name;
			private int age;

			public Student() {
			}

			public Student(String name) {
				this.name = name;
			}

			protected Student(int age) {
				this.age = age;
			}

			private Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + "}";
			}
			}
					
			
				
			import java.lang.reflect.Field;

			public class MyReflectDemo {
				public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
			/*
			Class类中用于获取成员变量的方法
				Field[] getFields():                返回所有公共成员变量对象的数组
				Field[] getDeclaredFields():        返回所有成员变量对象的数组
				Field getField(String name):        返回单个公共成员变量对象
				Field getDeclaredField(String name):返回单个成员变量对象

			 Field类中用于创建对象的方法
				void set(Object obj, Object value):赋值
				Object get(Object obj)              获取值

			*/


			//1.获取class字节码文件的对象
			Class clazz = Class.forName("com.itheima.myreflect3.Student");

			//2.获取所有的成员变量
			/* Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				System.out.println(field);
			}*/

			//获取单个的成员变量
			Field name = clazz.getDeclaredField("name");
			System.out.println(name);

			//获取权限修饰符
			int modifiers = name.getModifiers();
			System.out.println(modifiers);

			//获取成员变量的名字
			String n = name.getName();
			System.out.println(n);

			//获取成员变量的数据类型
			Class 尖括号?> type = name.getType();
			System.out.println(type);

			//获取成员变量记录的值
			Student s = new Student("zhangsan",23,"男");
			name.setAccessible(true);
			String value = (String) name.get(s);
			System.out.println(value);

			//修改对象里面记录的值
			name.set(s,"lisi");

			System.out.println(s);

			}
			}
				
			
				
			public class Student {
			private String name;
			private int age;
			public String gender;

			public Student() {
			}

			public Student(String name, int age, String gender) {
				this.name = name;
				this.age = age;
				this.gender = gender;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			/**
			 * 获取
			 * @return gender
			 */
			public String getGender() {
				return gender;
			}

			/**
			 * 设置
			 * @param gender
			 */
			public void setGender(String gender) {
				this.gender = gender;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
			}
			}
				
			
				
			import java.io.IOException;

			public class Student {
			private String name;
			private int age;

			public Student() {
			}

			public Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public void sleep(){
				System.out.println("睡觉");
			}

			private String eat(String something) throws IOException,NullPointerException,ClassCastException {
				System.out.println("在吃" + something);
				return "奥利给";
			}

			private void eat(String something,int a) {
				System.out.println("在吃" + something);
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + "}";
			}
			}
				
			
				
			import java.lang.reflect.InvocationTargetException;
			import java.lang.reflect.Method;
			import java.lang.reflect.Parameter;

			public class MyReflectDemo {
				public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
				/*
			Class类中用于获取成员方法的方法
				Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
				Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
				Method getMethod(String name, Class... parameterTypes) :返回单个公共成员方法对象
				Method getDeclaredMethod(String name, Class... parameterTypes):返回单个成员方法对象


		   Method类中用于创建对象的方法
				Object invoke(Object obj, Object... args):运行方法
				参数一:用obj对象调用该方法
				参数二:调用方法的传递的参数(如果没有就不写)
				返回值:方法的返回值(如果没有就不写)

			获取方法的修饰符
			获取方法的名字
			获取方法的形参
			获取方法的返回值
			获取方法的抛出的异常

			*/



			//1. 获取class字节码文件对象
			Class clazz = Class.forName("com.itheima.myreflect4.Student");

			//2. 获取里面所有的方法对象(包含父类中所有的公共方法)
		   /* Method[] methods = clazz.getMethods();
			for (Method method : methods) {
				System.out.println(method);
			}*/

			// 获取里面所有的方法对象(不能获取父类的,但是可以获取本类中私有的方法)
			/*Method[] methods = clazz.getDeclaredMethods();
			for (Method method : methods) {
				System.out.println(method);
			}*/

			// 获取指定的单一方法
			Method m = clazz.getDeclaredMethod("eat", String.class);
			System.out.println(m);

			// 获取方法的修饰符
			int modifiers = m.getModifiers();
			System.out.println(modifiers);

			// 获取方法的名字
			String name = m.getName();
			System.out.println(name);

			// 获取方法的形参
			Parameter[] parameters = m.getParameters();
			for (Parameter parameter : parameters) {
				System.out.println(parameter);
			}

			//获取方法的抛出的异常
			Class[] exceptionTypes = m.getExceptionTypes();
			for (Class exceptionType : exceptionTypes) {
				System.out.println(exceptionType);
			}

			//方法运行
			/*Method类中用于创建对象的方法
			Object invoke(Object obj, Object... args):运行方法
			参数一:用obj对象调用该方法
			参数二:调用方法的传递的参数(如果没有就不写)
			返回值:方法的返回值(如果没有就不写)*/


			Student s = new Student();
			m.setAccessible(true);
			//参数一s:表示方法的调用者
			//参数二"汉堡包":表示在调用方法的时候传递的实际参数
			String result = (String) m.invoke(s, "汉堡包");
			System.out.println(result);


			}
			}
				
			
				
			import java.io.BufferedWriter;
			import java.io.FileWriter;
			import java.io.IOException;
			import java.lang.reflect.Field;

			public class MyReflectDemo {
				public static void main(String[] args) throws IllegalAccessException, IOException {
			/*
				对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去
			*/
			   Student s = new Student("小A",23,'女',167.5,"睡觉");
			   Teacher t = new Teacher("播妞",10000);
			   saveObject(s);
			}

			//把对象里面所有的成员变量名和值保存到本地文件中
			public static void saveObject(Object obj) throws IllegalAccessException, IOException {
				//1.获取字节码文件的对象
				Class clazz = obj.getClass();
				//2. 创建IO流
				BufferedWriter bw = new BufferedWriter(new FileWriter("myreflect\\a.txt"));
				//3. 获取所有的成员变量
				Field[] fields = clazz.getDeclaredFields();
				for (Field field : fields) {
					field.setAccessible(true);
					//获取成员变量的名字
					String name = field.getName();
					//获取成员变量的值
					Object value = field.get(obj);
					//写出数据
					bw.write(name + "=" + value);
					bw.newLine();
				}

				bw.close();

			}
			}
				
			
				
			public class Student {
			private String name;
			private int age;
			private char gender;
			private double height;
			private String hobby;

			public Student() {
			}

			public Student(String name, int age, char gender, double height, String hobby) {
				this.name = name;
				this.age = age;
				this.gender = gender;
				this.height = height;
				this.hobby = hobby;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			/**
			 * 获取
			 * @return gender
			 */
			public char getGender() {
				return gender;
			}

			/**
			 * 设置
			 * @param gender
			 */
			public void setGender(char gender) {
				this.gender = gender;
			}

			/**
			 * 获取
			 * @return height
			 */
			public double getHeight() {
				return height;
			}

			/**
			 * 设置
			 * @param height
			 */
			public void setHeight(double height) {
				this.height = height;
			}

			/**
			 * 获取
			 * @return hobby
			 */
			public String getHobby() {
				return hobby;
			}

			/**
			 * 设置
			 * @param hobby
			 */
			public void setHobby(String hobby) {
				this.hobby = hobby;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + ", gender = " + gender + ", height = " + height + ", hobby = " + hobby + "}";
			}
			}
				
			
				
			public class Teacher {
			private String name;
			private double salary;

			public Teacher() {
			}

			public Teacher(String name, double salary) {
				this.name = name;
				this.salary = salary;
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return salary
			 */
			public double getSalary() {
				return salary;
			}

			/**
			 * 设置
			 * @param salary
			 */
			public void setSalary(double salary) {
				this.salary = salary;
			}

			public String toString() {
				return "Teacher{name = " + name + ", salary = " + salary + "}";
			}
			}
				
			
				
			import java.io.FileInputStream;
			import java.io.IOException;
			import java.lang.reflect.Constructor;
			import java.lang.reflect.InvocationTargetException;
			import java.lang.reflect.Method;
			import java.util.Properties;

			public class MyReflectDemo {
				public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
				/*
			反射可以跟配置文件结合的方式,动态的创建对象,并调用方法
			*/


			//1.读取配置文件中的信息
			Properties prop = new Properties();
			FileInputStream fis = new FileInputStream("myreflect\\prop.properties");
			prop.load(fis);
			fis.close();
			System.out.println(prop);


			//2.获取全类名和方法名
			String className = (String) prop.get("classname");
			String methodName = (String) prop.get("method");

			System.out.println(className);
			System.out.println(methodName);

			//3.利用反射创建对象并运行方法
			Class clazz = Class.forName(className);

			//获取构造方法
			Constructor con = clazz.getDeclaredConstructor();
			Object o = con.newInstance();
			System.out.println(o);

			//获取成员方法并运行
			Method method = clazz.getDeclaredMethod(methodName);
			method.setAccessible(true);
			method.invoke(o);

			}
			}
				
			
				
			public class Student {
			private String name;
			private int age;

			public Student() {
			}

			public Student(String name, int age) {
				this.name = name;
				this.age = age;
			}

			public void study(){
				System.out.println("学生在学习!");
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return age
			 */
			public int getAge() {
				return age;
			}

			/**
			 * 设置
			 * @param age
			 */
			public void setAge(int age) {
				this.age = age;
			}

			public String toString() {
				return "Student{name = " + name + ", age = " + age + "}";
			}
			}
				
			
				
			public class Teacher {
			private String name;
			private double salary;

			public Teacher() {
			}

			public Teacher(String name, double salary) {
				this.name = name;
				this.salary = salary;
			}

			public void teach(){
				System.out.println("老师在教书!");
			}

			/**
			 * 获取
			 * @return name
			 */
			public String getName() {
				return name;
			}

			/**
			 * 设置
			 * @param name
			 */
			public void setName(String name) {
				this.name = name;
			}

			/**
			 * 获取
			 * @return salary
			 */
			public double getSalary() {
				return salary;
			}

			/**
			 * 设置
			 * @param salary
			 */
			public void setSalary(double salary) {
				this.salary = salary;
			}

			public String toString() {
				return "Teacher{name = " + name + ", salary = " + salary + "}";
			}
			}
				
			
单词