框架开发原理/类加载器加载配置文件

来源:互联网 发布:网站域名到期怎么回事 编辑:程序博客网 时间:2024/05/17 17:39

Properties可以将文件读到内存中,同时也可以将内存中的文件保存到文件,详见http://blog.csdn.net/hjh200507609/article/details/50315855


</pre><pre name="code" class="java">package com.hjh.test;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.io.InputStream;import java.lang.reflect.Method;import java.util.Properties;public class Test {/** * @param args */public static void main(String[] args) throws Exception{System.out.println(TrafficLamp.RED.nextLamp().getTime());//通过类加载器加载项目下的配置文件InputStream inputStream = TrafficLamp.class.getClassLoader().getResourceAsStream("com/hjh/test/config.properties");//TrafficLamp.class.getResourceAsStream("config.properties");相对于TrafficLamp文件夹,作用等同于上Properties properties = new Properties();properties.load(inputStream);//取得动态的名称String className = properties.getProperty("className");System.out.println(className);//实例化无参构造函数,如果知道具体类型,可强转调用方法Object object = Class.forName(className).newInstance();String propertyName = "time";//对象属性的名称PropertyDescriptor descriptor = new PropertyDescriptor(propertyName, TrafficLamp.class);//获取某类的某属性的描述符Method sMethod = descriptor.getReadMethod();//取得属性的读方法即get方法,同样可取得set方法Object ssssObject = sMethod.invoke(TrafficLamp.RED);//执行对象的方法System.out.println(ssssObject);//BeanInfo beanInfo = Introspector.getBeanInfo(TrafficLamp.class);//将某类看做JavaBean看待//beanInfo.getPropertyDescriptors();//得到所有的属性描述符,但需要遍历才能找到需要的属性执行,效率不如上;}/** * 带有抽象方法和构造函数的枚举 * @author hjh * */public enum TrafficLamp{RED(30){@Overridepublic TrafficLamp nextLamp() {return GREEN;}},GREEN(15){@Overridepublic TrafficLamp nextLamp() {return YELLOW;}},YELLOW(3){@Overridepublic TrafficLamp nextLamp() {return RED;}};public abstract TrafficLamp nextLamp();private int time;private TrafficLamp(int time){setTime(time);}public int getTime() {return time;}public void setTime(int time) {this.time = time;}}}

类加载器BootStrap(Java虚拟机加载器,加载其他的类加载器,加载rt.jar,属于最顶层的类加载器)==> ExtClassLoader(ext.jar中类加载器) ==>AppClassLoader(CLASSPATH目录下的类加载器),按父子关系呈现;
每个类加载器必须有个父类;属于一个委托加载机制,委托父类加载器执行,如果最顶层无法加载,抛异常;


自定义类加载器:
1.继承ClassLoader;

2.loadClass()父类处理的方法,因此子类不需要重写,始终执行父类的此方法就可以;findClass()(自己处理,每个子类处理方法不一样),因此可以重写;

3.defineClass()返回class的字节码,父类已经实现,直接在findClass方法中调用即可;


package com.hjh.test;import java.io.ByteArrayOutputStream;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;public class ClassLoaderTest {/** * @param args */public static void main(String[] args) throws Exception{new ClassLoaderTest().proxy();}/** * 自定义类加载器 * @author Administrator * */public class MyClassLoader extends ClassLoader{@Overrideprotected Class<?> findClass(String arg0) throws ClassNotFoundException {ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();defineClass(arrayOutputStream.toByteArray(), 0,arrayOutputStream.toByteArray().length);return super.findClass(arg0);}}/** * 动态类测试 * @throws Exception */public void proxy() throws Exception{Class clazz = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);//参数表示对应的接口和接口的类加载器//生成类的实例通过带参的构造函数Collection collection = (Collection) clazz.getConstructor(InvocationHandler.class).newInstance(new InvocationHandler(){@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return 2;}});collection.clear();collection.size();//返回值为InvocationHandler接口invoke()方法的返回值System.out.println(collection.size());Collection collection2 = (Collection) Proxy.newProxyInstance(Collection.class.getClassLoader(), new Class[]{Collection.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {ArrayList arrayList = new ArrayList<>();//执行方法的对象Object object = method.invoke(arrayList, args);return object;}});collection2.add(1);collection2.add(2);collection2.size();System.out.println(collection2.size());}class MyInvokeHandler implements InvocationHandler{private Object tartgetObject;public MyInvokeHandler(){}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return null;}}
<span style="white-space:pre"></span><pre name="code" class="java">/** * 动态代理类 * @param target 目标对象 * @param work 实现接口的类 * @return */public Object getProxy(final Object target,final Work work){Object object = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {work.beginWork();Object object = method.invoke(target, args);work.endWork();return object;}});return object;}public interface Work{void beginWork();void endWork();}

}



0 0
原创粉丝点击