import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; /* 第ä¸å¨ä½ä¸: 2.ï¼å¿ åï¼èªå®ä¹ä¸ä¸ª Classloaderï¼å è½½ä¸ä¸ª Hello.xlass æä»¶ï¼æ§è¡ hello æ¹æ³ï¼æ¤æä»¶å 容æ¯ä¸ä¸ª Hello.class æä»¶ææåèï¼x=255-xï¼å¤çåçæä»¶ãæä»¶ç¾¤éæä¾ã */ public class XlassLoader extends ClassLoader { public static void main(String[] args) throws Exception { // ç¸å ³åæ° final String className = "Hello"; final String methodName = "hello"; // å建类å è½½å¨ ClassLoader classLoader = new XlassLoader(); // å è½½ç¸åºçç±» Class> clazz = classLoader.loadClass(className); // ççé颿äºä»ä¹æ¹æ³ for (Method m : clazz.getDeclaredMethods()) { System.out.println(clazz.getSimpleName() + "." + m.getName()); } // å建对象 Object instance = clazz.getDeclaredConstructor().newInstance(); // è°ç¨å®ä¾æ¹æ³ Method method = clazz.getMethod(methodName); method.invoke(instance); } @Override protected Class> findClass(String name) throws ClassNotFoundException { // å¦ææ¯æå å, åéè¦è¿è¡è·¯å¾è½¬æ¢ String resourcePath = name.replace(".", "/"); // æä»¶åç¼ final String suffix = ".xlass"; // è·åè¾å ¥æµ InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resourcePath + suffix); try { // è¯»åæ°æ® int length = inputStream.available(); byte[] byteArray = new byte[length]; inputStream.read(byteArray); // è½¬æ¢ byte[] classBytes = decode(byteArray); // éç¥åºå±å®ä¹è¿ä¸ªç±» return defineClass(name, classBytes, 0, classBytes.length); } catch (IOException e) { throw new ClassNotFoundException(name, e); } finally { close(inputStream); } } // è§£ç private static byte[] decode(byte[] byteArray) { byte[] targetArray = new byte[byteArray.length]; for (int i = 0; i < byteArray.length; i++) { targetArray[i] = (byte) (255 - byteArray[i]); } return targetArray; } // å ³é private static void close(Closeable res) { if (null != res) { try { res.close(); } catch (IOException e) { e.printStackTrace(); } } } }