怎么设置iis默认网站,小型企业网络组建方案,深圳外贸建站网络推广价格,在线手机网页制作前言
就比如我前几天被面试官问什么是反射#xff1f;#xff1f;#xff1f;
而我的回答是#xff01;#xff01;#xff01;
反射是动态语言的关键#xff0c;反射允许程序在执行期间借助Reflection API取得任何类的内部信息#xff0c;并能直接操作任曦对象的内…
前言
就比如我前几天被面试官问什么是反射
而我的回答是
反射是动态语言的关键反射允许程序在执行期间借助Reflection API取得任何类的内部信息并能直接操作任曦对象的内部属性及方法。
1.Java反射提供的功能
在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类具有的成员变量和方法在运行时调用任意一个对象的成员变量和方法
2.放射常用的API
java.lang.Class : 代表一个类java.lang.reflect.Method代表类的方法java.lang.reflect.Field代表类的成员变量java .lang.reflect.Construct代表类的构造方法
3.java.lang.Class
我们创建一个类通过编译Javac.exe),生成对应的.class文件。之后我们使用java.exe加载JVM类加载器此.class文件。此.class文件加载到内存以后就是一个运行时类。存放在缓冲区,Class允许通过一个实例化对象找到一个类的完成信息资料。
Class类的作用 1.每一个运行时类只加载一次!2.获取对应的运行时类的完整结构属性方法构造器内部类父类所在包异常注 解。。。。 3.调用对应的运行时类的指定结构属性方法构造器4.反射应用动态代理
4.获取Class对象。
1.调用运行时类本身的.class属性
ClassPerson personClass01 Person.class;2.通过运行时类的一个对象
Person person new Person();
Class? extends Person aClass person.getClass();3.通过Class.forName(com.jdy.bean.Dog)
Class? aClass1 Class.forName(com.jdy.bean.Dog);4.通过类的加载器
ClassLoader classLoader this.getClass().getClassLoader();5.Class类的常用方法
public Constructor?[] getConstructors() throws SecurityException //获取类的全部构造
public Field[] getDeclaredFields() throws SecurityException//获取类中全部的属性
public Field[] getFields() throws SecurityException //获取继承的全部属性
public Method[] getMethods() throws SecurityException//获取一个类中的所有方法
public Class?[] getInterfaces() //获取类实现的所有接口
public native Class? super T getSuperclass();//获取类的父类
//加入Java开发交流君样593142328一起吹水聊天6.Class应用
1通过无参构造实例化对象
String packageName com.jdy.bean.Dog;
Class? aClass Class.forName(packageName);
Dog dog (Dog)aClass.newInstance(); //使用newInstance()必须保证实例化类中存在一个无参构造器2调用有参构造器实例化对象
public int getModifiers()//获取构造方法的修饰符
public String getName()//获取构造方法的名称
public Class?[] getParameterTypes()//获取构造方法的参数类型
public T newInstance(Object ... initargs)//像构造方法传入参数实例化对象
Dog constructor (ConstructorDog) aClass.getConstructor(String.class, String.class, String.class);
Dog dog1 constructor.newInstance(二狗子, 黑背, 8);3获取类结构
Constructor:表示类的构造器Field:表示类的属性Method:表示类的方法
取得所有实现的接口
[] interfaces aClass.getInterfaces();取得父类
Class? superclass aClass.getSuperclass();取得全部构造器
Constructor?[] constructors aClass.getConstructors();将访问修饰符由数字转化成可看懂的
int modifiers declaredField.getModifiers();
System.out.println(modifiers Modifier.toString(modifiers));
取得所有的方法
Method[] methods aClass.getMethods();
取得全部属性 //得到实现的接口或父类中的公共属性
Field[] fields aClass.getFields(); //得到本类当中的全部属性
Field[] declaredFields aClass.getDeclaredFields();Field的常用方法
//得到一个对象中属性的具体内容
public Object get(Object obj)throws IllegalArgumentException, IllegalAccessException
//设置指定对象中属性的具体内容
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException//得到属性的修饰符
public int getModifiers() //返回属性的名称
public String getName() //判断属性是否可悲外部访问
public boolean isAccessible() //设置一个属性是否可被外部方法
public void setAccessible(boolean flag) throws SecurityException
//加入Java开发交流君样593142328一起吹水聊天4通过反射待用类中的方法
Method destory_method aClass.getMethod(destory_method); //invoke方法的参数是一个实例化的对象
Object invoke destory_method.invoke(aClass.newInstance());5通过方法操作属性
反射中通过Field类提供的set()/get()完成设置和取得属性内容的操作但是类中的属性都设置成私有的访问权限所以在使用set()/get()方法时首先要使用Field()中的setAccessible(true),方法将需要操作的属性设置成可被外部访问。
Field field0 personClass.getDeclaredField(address); //todo 什么校验
field0.setAccessible(true);
field0.set(person,xian);
System.out.println(person);一般给类的属性赋值不建议使用以上方法因为扩大了属性的访问权限建议使用类中属性的getter/setter方法
5.ClassLoader:类的加载器 类的加载器是用来把类class装载进内存的JVM规范定义了两种类型的类加载器 启动类加载器bootstrap 用户类加载器user-defind class loader JVM 在运行时会产生3个类加载器组成的初始化加载器层次结构 Bootstrap ClassLoader引导类加载器用C编写时jVM自带的类加载器负责JAVA平台核心类库的加载。该加载器无法直接获取资料
//3.引导类加载器不能直接获取
ClassLoader parent1 parent.getParent();
System.out.println(引导类加载器 parent1);//nullExtension ClassLoader负责jre/lib/ext目录下的jar包或者 -D java.ext.dirs指定目录下的jar包装入工作库
//2.获取扩展类加载器
ClassLoader parent loader.getParent();
System.out.println(扩展类加载器 parent);System ClassLoader系统类加载器负责java -classpath或者 -D java.class.path所知的目录下的类与jar包装入工作是最常用的加载器
//1.获取系统类加载器
ClassLoader loader ClassLoader.getSystemClassLoader();
System.out.println(系统类加载器 loader);获取某个实例的类加载器
Person person new Person();
Class? extends Person aClass person.getClass();
ClassLoader classLoader aClass.getClassLoader();
System.out.println(Perosn类的加载器 classLoader);aClass1 Class.forName(com.jdy.bean.Dog);
ClassLoader classLoader1 aClass1.getClassLoader();
System.out.println(Dog类的加载器 classLoader1);类加载器配合IO
ClassLoader classLoader2 this.getClass().getClassLoader();
InputStream resourceAsStream classLoader2.getResourceAsStream(test.properties);
Properties properties new Properties();
properties.load(resourceAsStream);
最后祝大家早日学有所成拿到满意offer