承德网站建设咨询,帝国和WordPress比较,施工企业的施工生产计划与建设,六安品牌网站建设怎么样反射和动态管理#xff08;二十-完#xff09;
反射
反射允许对字段#xff08;成员变量#xff09;#xff0c;成员方法#xff0c;构造方法的信息进行编程访问。
反射操作可分为获取和解刨。
获取不是从java文件获取#xff0c;而是从class字节码文件获取。
作用…反射和动态管理二十-完
反射
反射允许对字段成员变量成员方法构造方法的信息进行编程访问。
反射操作可分为获取和解刨。
获取不是从java文件获取而是从class字节码文件获取。
作用
获取一个类里面的所有的信息获取到后再执行其他的业务逻辑结合配置文件动态的创建对象并调用方法
获取class对象
Class.forname(“全类名”) 全类名包名类名‘该方法是最为常用的 类名.class 一般当做当前参数进行传递比如synchronized(类名.class) 对象.getclass 有该类的对象后才可使用
范例
//Student.java
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 };}
}//Test.java
public class Test {public static void main(String[] args) throws ClassNotFoundException {Class class1 Class.forName(reflect.Student);System.out.println(class1);Class class2 Student.class;System.out.println(class2);Student studentnew Student();Class class3student.getClass();System.out.println(class3);System.out.println(class1class2);System.out.println(class2class3);}
}
/*
class reflect.Student
class reflect.Student
class reflect.Student
true
true
*/获取构造方法
Class类中用于获取构造方法的方法
getConstructors
Constructor?[] getConstructors()
说明返回所有公共构造方法对象的数组
getDeclaredConstructors
Constructor?[] getDeclaredConstructors()
说明返回所有构造方法对象的数组
getConstructor
Constructor getConstructor(Class?…parameterTypes)
说明返回单个公共构造方法对象
getDeclaredConstructor
Constructor getDeclaredConstructor(Class?…parameterTypes)
说明返回单个构造方法对象
Constructor类中用于创建对象的方法
newInstance
T newInstance(Object…initargs)
说明根据指定的构造方法创建对象
setAccessible
setAccessible(boolean flag)
说明设置为true表示取消访问检查
范例
//Student.java
public class Student {private String name;private int age;public Student() {}public Student(String name) {this.name name;}private Student(String name, int age) {this.name name;this.age age;}protected Student(int age){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 };}
}//Test.java
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class clazz Class.forName(reflect.Student);//getConstructorsConstructor[] constructors1 clazz.getConstructors();for (Constructor constructor:constructors1){System.out.println(constructor);}System.out.println();//getDeclaredConstructorsConstructor[] constructors2 clazz.getDeclaredConstructors();for (Constructor constructor:constructors2){System.out.println(constructor);}System.out.println();//getConstructorConstructor constructor1 clazz.getConstructor();System.out.println(constructor1);System.out.println();//getDeclaredConstructorConstructor constructor2 clazz.getDeclaredConstructor(String.class,int.class);System.out.println(constructor2);System.out.println();System.out.println(constructor2.getModifiers());//获取权限修饰符以数字的形式表现System.out.println();Parameter[] parameters constructor2.getParameters();//获取参数for (Parameter parameter:parameters){System.out.println(parameter);}//newInstance和setAccessible//暴力反射临时取消权限校验constructor2.setAccessible(true);//使private类型的构造方法可以创建Student student(Student) constructor2.newInstance(张三,3);System.out.println(student);}
}
/*
public reflect.Student(java.lang.String)
public reflect.Student()protected reflect.Student(int)
private reflect.Student(java.lang.String,int)
public reflect.Student(java.lang.String)
public reflect.Student()public reflect.Student()private reflect.Student(java.lang.String,int)2java.lang.String arg0
int arg1
Student{name 张三, age 3}*/获取成员变量
Class类中获取成员变量对象的方法
getFields
Field[] getFields()
说明返回所有公共成员变量对象的数组
getDeclaredFields
Field[] getDeclaredFields()
说明返回所有成员变量对象的数组
getField
Field getField(String name)
说明返回单个公共成员变量对象
getDeclaredField
Field getDeclaredField(String name)
说明返回单个成员变量对象
Field类中用于创建对象的方法
set
void set(Object obj,Object value)
说明赋值
get
Object get(Object obj)
说明获取值
范例
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class clazzClass.forName(reflect.Student);//getFieldsField[] fields1 clazz.getFields();for (Field field:fields1){System.out.println(field);}System.out.println();//getDeclaredFieldsField[] fields2 clazz.getDeclaredFields();for (Field field:fields2){System.out.println(field);}System.out.println();//getFieldField field1clazz.getField(sex);System.out.println(field1);System.out.println();//getDeclaredFieldField field2clazz.getDeclaredField(name);System.out.println(field2);System.out.println();//getSystem.out.println(field1.getModifiers());//获取变量修饰符System.out.println(field1.getName());//获取变量名Class? type field1.getType();//获取变量类型System.out.println(type);System.out.println();Student studentnew Student(张三,18,男);field2.setAccessible(true);String s(String)field2.get(student);System.out.println(s);System.out.println();field2.set(student,李四);System.out.println(student);}
}
/*
public java.lang.String reflect.Student.sexprivate java.lang.String reflect.Student.name
private int reflect.Student.age
public java.lang.String reflect.Student.sexpublic java.lang.String reflect.Student.sexprivate java.lang.String reflect.Student.name1
sex
class java.lang.String张三Student{name 李四, age 18, sex 男}*/获取成员方法
Class类中用于获取成员方法的方法
getMethods
Method[] getMethods()
说明返回所有公共成员方法对象的数组包括继承的
getDeclaredMethods
Method[] getDeclaredMethods()
说明返回所有成员方法对象的数组不包括继承的
getMethod
Method getMethods(String name,Class?…parameterTypes)
说明返回单个公共成员方法对象
getDeclaredMethod
Method getDeclaredMethods(String name,Class?…parameterTypes)
说明返回单个成员方法对象
Method类中用于创建对象的方法
Object invoke(Object obj,Object…args);运行方法
参数一用obj对象调用该方法
参数二调用方法的传递的参数若无则不写
返回值方法的返回值若无则不写
范例
//Test.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class clazzClass.forName(reflect.Student);//getMethodsMethod[] methods1 clazz.getMethods();for (Method method:methods1){System.out.println(method);}System.out.println();//getDeclaredMethodsMethod[] methods2clazz.getDeclaredMethods();for(Method method:methods2){System.out.println(method);}System.out.println();//getMethodMethod study clazz.getMethod(study, String.class);System.out.println(study);System.out.println();//getMethodsMethod eat clazz.getDeclaredMethod(eat, String.class,String.class);System.out.println(eat);System.out.println();System.out.println(eat.getModifiers());//获取修饰符System.out.println(eat.getName());//获取名字Parameter[] parameters eat.getParameters();for (Parameter parameter:parameters){System.out.println(parameter);}Class[] exceptionTypes study.getExceptionTypes();for (Class ex:exceptionTypes){System.out.println(ex);}System.out.println();Student studentnew Student(路人甲,8);eat.setAccessible(true);String result(String)eat.invoke(student,汉堡包,可乐);System.out.println(result);}
}
//Student
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;}private String eat(String food,String drink){System.out.println(name正在吃food正在喝drink);return 排泄物;}private String eat(String food){System.out.println(name正在吃food);return 排泄物;}public void study(String name)throws IOException,ArrayIndexOutOfBoundsException {System.out.println(name正在学习);}/*** 获取* 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 java.lang.String reflect.Student.toString()
public java.lang.String reflect.Student.getName()
public void reflect.Student.setName(java.lang.String)
public int reflect.Student.getAge()
public void reflect.Student.setAge(int)
public void reflect.Student.study(java.lang.String) throws java.io.IOException,java.lang.ArrayIndexOutOfBoundsException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()public java.lang.String reflect.Student.toString()
public java.lang.String reflect.Student.getName()
public void reflect.Student.setName(java.lang.String)
public int reflect.Student.getAge()
public void reflect.Student.setAge(int)
private java.lang.String reflect.Student.eat(java.lang.String)
private java.lang.String reflect.Student.eat(java.lang.String,java.lang.String)
public void reflect.Student.study(java.lang.String) throws java.io.IOException,java.lang.ArrayIndexOutOfBoundsExceptionpublic void reflect.Student.study(java.lang.String) throws java.io.IOException,java.lang.ArrayIndexOutOfBoundsExceptionprivate java.lang.String reflect.Student.eat(java.lang.String,java.lang.String)2
eat
java.lang.String arg0
java.lang.String arg1
class java.io.IOException
class java.lang.ArrayIndexOutOfBoundsException路人甲正在吃汉堡包正在喝可乐
排泄物
*/范例
例1
//对于任意一个对象都可以吧对象的所有字段名和值保存到文件中去
//Test.java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;public class Test {public static void main(String[] args) throws IOException, IllegalAccessException {Student snew Student(张三,18);Teacher tnew Teacher(李四,19999.0,3,11);//saveFile(t);//saveFIle(s)}public static void saveFile(Object obj) throws IOException, IllegalAccessException {BufferedWriter bwnew BufferedWriter(new FileWriter(a.txt));Class clazz obj.getClass();Field[] fields clazz.getDeclaredFields();for (Field field:fields){field.setAccessible(true);String name field.getName();Object value field.get(obj);bw.write(namevalue);bw.newLine();}bw.close();}
}//Student.java
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 };}
}
//Teacher.java
public class Teacher {private String name;private double salary;private int id;private int age;public Teacher() {}public Teacher(String name, double salary, int id, int age) {this.name name;this.salary salary;this.id id;this.age age;}/*** 获取* 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;}/*** 获取* return id*/public int getId() {return id;}/*** 设置* param id*/public void setId(int id) {this.id id;}/*** 获取* return age*/public int getAge() {return age;}/*** 设置* param age*/public void setAge(int age) {this.age age;}public String toString() {return Teacher{name name , salary salary , id id , age age };}
}
/*
若是执行saveFile(t)
a.txt内容为
name李四
salary19999.0
id3
age11*/
/*
若是执行saveFile(s)
a.txt内容为
name张三
age18*/例2
//反射可以跟配置文件结合的方式动态的创建对象并调用方法
/*properties.properties
classnamereflect.Teacher
methodteach
*/
//Student.java
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 };}public void study(){System.out.println(学习);}
}
//Teacher.java
public class Teacher {private String name;private double salary;private int id;private int age;public Teacher() {}public Teacher(String name, double salary, int id, int age) {this.name name;this.salary salary;this.id id;this.age age;}/*** 获取* 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;}/*** 获取* return id*/public int getId() {return id;}/*** 设置* param id*/public void setId(int id) {this.id id;}/*** 获取* return age*/public int getAge() {return age;}/*** 设置* param age*/public void setAge(int age) {this.age age;}public String toString() {return Teacher{name name , salary salary , id id , age age };}public void teach(){System.out.println(教学);}
}
//Test.java
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 Test {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Properties pronew Properties();FileInputStream fis new FileInputStream(properties.properties);pro.load(fis);fis.close();String name(String) pro.get(classname);String method(String)pro.get(method);Class clazzClass.forName(name);Constructor constructor clazz.getDeclaredConstructor();Object o constructor.newInstance();System.out.println(o);Method method1 clazz.getDeclaredMethod(method);method1.setAccessible(true);method1.invoke(o);}
}
/*
Teacher{name null, salary 0.0, id 0, age 0}
教学
*/动态代理
代理可以无侵入式不改变原有代码的给对象增强其他功能。
对象若嫌身上干的事太多可通过代理转移部分职责。
对象若有方法要被代理代理则一定要有对应的方法。
调用者调用对象的方法时是由调用者先调用代理的方法再由代理调用对象的方法。
代理长什么样代理里面是对象要被代理的方法。
java通过接口保证代理的样子后面的对象和代理需要实现同一个接口接口中就是被代理的所有方法。
Proxy
java.lang.reflect.Proxy类提供为对象产生代理对象的方法:
public static Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h)
参数一用于指定用哪个类加载器去加载生成的代理类
参数二指定接口这些接口用于指定生成的代理长什么样也就是有哪些方法
参数三用来指定生成的代理对象要干什么事情
范例
//Cinema.java
public class Cinema implements CinemaExtend{private String name;public Cinema() {}Overridepublic String watchMovie(){System.out.println(进入name电影院);return 看电影;}Overridepublic void eatPopcorn(String audience){System.out.println(audience吃爆米花);}public Cinema(String name) {this.name name;}/*** 获取* return name*/public String getName() {return name;}/*** 设置* param name*/public void setName(String name) {this.name name;}public String toString() {return Cinema{name name };}
}
//CinemaExtend.java
public interface CinemaExtend {public abstract String watchMovie();public abstract void eatPopcorn(String audience);
}
//ProxyUtil.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static CinemaExtend createProxy(Cinema cinema){CinemaExtend cinemaExtend(CinemaExtend)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{CinemaExtend.class}, new InvocationHandler() {Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(watchMovie.equals(method.getName())){System.out.println(买电影票);}else if(eatPopcorn.equals(method.getName())){System.out.println(买爆米花);}return method.invoke(cinema,args);}});return cinemaExtend;}
}
//Test.java
public class Test {public static void main(String[] args) {Cinema cinemanew Cinema(万达);CinemaExtend ceProxyUtil.createProxy(cinema);ce.eatPopcorn(路人甲);System.out.println();System.out.println(ce.watchMovie());}
}
/*
买爆米花
路人甲吃爆米花买电影票
进入万达电影院
看电影
*/