华为二面:说一下Java反射机制的应用场景
反射的优势和劣势 反射的应用场景
反射的优势和劣势
优势 运行期类型的判断,动态类加载:提高代码灵活度
劣势 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多
反射的应用场景
JDBC 的数据库的连接
通过Class.forName()加载数据库的驱动程序 (通过反射加载,前提是引入相关了Jar包) 通过 DriverManager 类进行数据库的连接,连接的时候要输入数据库的连接地址、用户名、密码 通过Connection 接口接收连接
public class ConnectionJDBC {/*** @param args*///驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中public static final String DBDRIVER = "com.mysql.jdbc.Driver";//连接地址是由各个数据库生产商单独提供的,所以需要单独记住public static final String DBURL = "jdbc:mysql://localhost:3306/test";//连接数据库的用户名public static final String DBUSER = "root";//连接数据库的密码public static final String DBPASS = "";public static void main(String[] args) throws Exception {Connection con = null; //表示数据库的连接对象Class.forName(DBDRIVER); //1、使用CLASS 类加载驱动程序 ,反射机制的体现con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、连接数据库System.out.println(con);con.close(); // 3、关闭数据库}
Spring 框架的使用
将程序内所有 XML 或 Properties 配置文件加载入内存中 Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息 使用反射机制,根据这个字符串获得某个类的Class实例 动态配置实例的属性
public class BeanFactory {private Map<String, Object> beanMap = new HashMap<String, Object>();/*** bean工厂的初始化.* @param xml xml配置文件*/public void init(String xml) {try {//读取指定的配置文件SAXReader reader = new SAXReader();ClassLoader classLoader = Thread.currentThread().getContextClassLoader();//从class目录下获取指定的xml文件InputStream ins = classLoader.getResourceAsStream(xml);Document doc = reader.read(ins);Element root = doc.getRootElement();Element foo;//遍历beanfor (Iterator i = root.elementIterator("bean"); i.hasNext();) {foo = (Element) i.next();//获取bean的属性id和classAttribute id = foo.attribute("id");Attribute cls = foo.attribute("class");//利用Java反射机制,通过class的名称获取Class对象Class bean = Class.forName(cls.getText());//获取对应class的信息java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);//获取其属性描述java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();//设置值的方法Method mSet = null;//创建一个对象Object obj = bean.newInstance();//遍历该bean的property属性for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {Element foo2 = (Element) ite.next();//获取该property的name属性Attribute name = foo2.attribute("name");String value = null;//获取该property的子元素value的值for(Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) {Element node = (Element) ite1.next();value = node.getText();break;}for (int k = 0; k < pd.length; k++) {if (pd[k].getName().equalsIgnoreCase(name.getText())) {mSet = pd[k].getWriteMethod();//利用Java的反射极致调用对象的某个set方法,并将值设置进去mSet.invoke(obj, value);}}}//将对象放入beanMap中,其中key为id值,value为对象beanMap.put(id.getText(), obj);}} catch (Exception e) {System.out.println(e.toString());}}//other codes}最近给大家找了 通用权限系统
资源,怎么领取?
扫二维码,加我微信,回复:通用权限系统
注意,不要乱回复 没错,不是机器人 记得一定要等待,等待才有好东西
评论
