很早很早之前,我有一个奇怪的想法,就比如说一部电影,他最后可以存储到电脑中,那么他只要能存储到电脑上,它其实就是一堆0和1,因为计算机只能识别0和1,所以,我们能不能,通过计算机,以某种方式,把这堆0和1给生成出来,那么,这个电影是不是以后不用拍了,直接在计算机上生成就可以了,当然,怎么生成的这个办法,我还没想好,哈哈,好奇怪的想法。
java类加载机制,
java默认有三个类加载器
1 BoopStrap ClassLoader(启动类加载器)
2 ExtClassLoader(扩展类加载器)
3 AppClassLoader(应用程序类加载器)
顾名思义,就是加载自己相应的类
自定义类加载器是自己定义的,一般我们都不用写类加载器的,直接用AppClassLoader这个类加载器,如果自己定义类加载器了,那证明已经接触到一些稍微高级的点的东西了。
下面展示一个自定义类加载器,它加载了一个在项目之外的类,通过反射调用了它的方法。
ClassLoaderTestTwo 类
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ClassLoaderTestTwo { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { ClassLoader myLoader = new ClassLoader() { @Override public Class<?> loadClass(String name) throws ClassNotFoundException { String fileName = ""; InputStream is; try { fileName = name.substring(name.lastIndexOf(".") + 1) + ".class"; System.out.println(fileName); is = new FileInputStream("C:\classloader\" + fileName); if (is == null) { return super.loadClass(name); } byte[] b = new byte[is.available()]; is.read(b); return defineClass(name, b, 0, b.length); } catch (IOException e) { try { is = getClass().getResourceAsStream(fileName); if (is == null) { return super.loadClass(name); } byte[] b; b = new byte[is.available()]; is.read(b); return defineClass(name, b, 0, b.length); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } return null; } }; Class obj = myLoader.loadClass("Hello"); Object newInstance = obj.newInstance(); for (int i = 0; i < obj.getMethods().length; i++) { System.out.println(obj.getMethods()[i].getName()); } obj.getMethod("test1").invoke(newInstance); // 调用方法 } }
Hello类 放在C:\classloader\目录下
public class Hello{ public static void main(String[]args){ System.out.println("Hello"); } public static void test(){ System.out.println("Hello"); } public static void test1(){ System.out.println("test1"); } }