首页 > 编程知识 正文

内功修炼八法,闭关修炼一般多长时间

时间:2023-05-05 03:11:15 阅读:162681 作者:4884

文章的目录反射是什么是反射机制? 反射机制的作用使用java反射机制创建对象示例使用无参数构造函数创建对象有参数如何使用构造函数创建对象如何禁止反射机制? spring操作场景jdbc操作场景什么是使用反射机制访问方法和属性访问方法为专用属性分配乞丐版springIOC的springIOC实现? springioc进程springioc创建对象实现思路

反射机制是什么?

反射机制是指运行动态获取类的所有信息的程序。

反射角色反编译:class - .java。

通过反射机制访问对象的属性、方法、生成方法等。

可以使用java反射机制在不使用new的情况下初始化类。

类的专用属性可以通过java反射机制赋值。

为了提高程序的扩展性,封装几个工具类,写框架都是使用反射机制的。

使用java反射创建对象实例初始化类现在使用new创建对象,然后使用反射创建对象。

使用缺省无参数构造函数创建对象package ch8; import lombok.allargsconstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.SneakyThrows; @ data @ allargsconstructor @ noargsconstructorclassuser { privatestring username; 私有字符串密码; } public class test1 { @ sneakythrowspublicstaticvoidmain (string [ ] args ) ({ //forName是类的完整路径,即包名类名class? aclass=class.forname(ch8.user ); //使用缺省无参数构造函数创建对象User user=(User ) aClass.newInstance (; system.out.println(user ); }

使用带参数的构造函数创建对象package ch8; import lombok.allargsconstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import Java.lang.reflect.constructor; @ data @ allargsconstructor @ noargsconstructorclassuser { privatestring username; 私有字符串密码; } public class test1 { @ sneakythrowspublicstaticvoidmain (string [ ] args ) ({ /* //forName中写入的类的完整路径,即包名类名clice aclass=class.forname(ch8.user ); //使用缺省无参数构造函数创建对象User user=(User ) aClass.newInstance (; system.out.println(user ); *///forName中的类的完整路径,即包名类名类名类名类名Class? aclass=class.forname(ch8.user ); 是否要使用getConstructor获取参数类型Constructor,该参数类型将传递给带参数的构造函数//参数? constructor=aclass.get constructor (string.class,string.class ); //要创建的User user2=(User ) constructor.newinstance('jack ',' 123 ' ); system.out.println(user2; }如何禁止反射机制? 即使将构造函数更改为private限定,反射也可以通过设置权限来禁止反射

使用spring场景写标签时,经常遇到以下格式

bean id=" user " class=" com.Java.bean.user "

class值写入类的reference path的目的之一是通过反射机制实例化对象

springIoc

在加载jdbc驱动程序类时,应编写以下jdbc使用场景:

class.forn Mae (“com.MySQL.JDBC.driver”)

使用反射机制的方法和属性访问属性package ch8; import java.la

ng.reflect.Field;public class Test2 { public static void main(String[] args) throws ClassNotFoundException { // 获取类的字节码文件 Class<?> aClass = Class.forName("ch8.User"); // 获取当前类的所有属性 Field[] declaredFields = aClass.getDeclaredFields(); // 遍历 for (Field field : declaredFields) { // 打印名称 System.out.println(field.getName()); } }}

访问方法 package ch8;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Test2 { public static void main(String[] args) throws ClassNotFoundException { // 获取类的字节码文件 Class<?> aClass = Class.forName("ch8.User"); // 获取类的所有方法 Method[] declaredMethods = aClass.getDeclaredMethods(); // 遍历输出 for (Method m : declaredMethods){ System.out.println(m.getName()); } }} 给私有属性赋值 package ch8;import java.lang.reflect.Field;import java.lang.reflect.Method;public class Test2 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException { // 获取类的字节码文件 Class<?> aClass = Class.forName("ch8.User"); // 实例化对象 User user = (User) aClass.newInstance(); // 获取属性 Field username = aClass.getDeclaredField("username"); // 设置权限,允许操作私有属性 username.setAccessible(true); // 属性赋值,第一个参数是类的对象, 第二个参数是赋的值 username.set(user, "likeghee"); // 获取属性 Field password = aClass.getDeclaredField("password"); // 设置权限 password.setAccessible(true); // 属性赋值 password.set(user, "1234"); // 打印 System.out.println(user); }} 乞丐版springIOC实现 什么是springIOC?

控制反转,将bean与bean之间的关系交给第三方容器进行管理,不用自己手动创建对象。

springioc过程

加载springxml配置文件
传入beanid获取bean对象

springioc创建对象

使用无参构造函数

实现思路 用dom4j解析xml通过beanid查找对应的xml节点,获取class节点属性使用java反射机制newInstance类使用java的反射机制给类属性赋值 实现

新建一个Context.xml放到resources文件夹下,模拟spring.xml

<?xml version="1.0" encoding="UTF-8"?><beans> <bean id="user1" class="myspringioc.User"> <property name="username" value="ghee"/> <property name="password" value="123"/> </bean></beans>

新建ClassPathXmlApplicationContext类,实现它的getBean方法

package myspringioc;import lombok.SneakyThrows;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;import java.lang.reflect.Field;import java.util.List;public class ClassPathXmlApplicationContext { private static String PATH; private static String ID; private static String CLASS; private static String NAME; private static String VALUE; public void init() { ID = "id"; CLASS = "class"; NAME = "name"; VALUE = "value"; } // 构造函数 public ClassPathXmlApplicationContext(String path) { PATH = path; } @SneakyThrows public Object getBean(String id) { init(); /* 1. 用dom4j解析xml 2. 通过beanid查找对应的xml节点,获取class节点属性 3. 使用java反射机制newInstance类 4. 使用java的反射机制给类属性赋值 */ if (id.equals("")) { return null; } SAXReader saxReader = new SAXReader(); // 读取resources下的配置文件 Document read = saxReader.read(this.getClass().getClassLoader().getResource(PATH)); // 遍历二级节点,查询beanid // 获取根节点 Element rootElement = read.getRootElement(); // 获取二级节点 List<Element> elements = rootElement.elements(); // 遍历查找 for (Element e : elements) { // 获取id属性的值 String beanId = e.attributeValue(ID); // 如果和传入的id相等,找到bean if (!beanId.equals(id)) { // 如果不相等就跳出本次循环 continue; } // 找到了beanid // 获取class属性值,也就是包PTAH String attClassPath = e.attributeValue(CLASS); // 初始化bean Class<?> aClass = Class.forName(attClassPath); Object classObj = aClass.newInstance(); // 获取三级节点 List<Element> propertyList = e.elements(); for(Element property: propertyList){ // 获取name属性的值 String attNameValue = property.attributeValue(NAME); // 通过反射找到类中的属性 Field declaredField = aClass.getDeclaredField(attNameValue); // 获取value属性的值 String attValueValue = property.attributeValue(VALUE); // 设置访问权限 declaredField.setAccessible(true); // 类属性赋值 declaredField.set(classObj, attValueValue); } return classObj; } return null; }}

测试代码

package myspringioc;public class Test { public static void main(String[] args) { ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("Context.xml"); User user1 = (User) classPathXmlApplicationContext.getBean("user1"); System.out.println(user1); }}

乞丐版ioc实现成功了

使用方便,但是初始化对象效率很低。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。