package com.miracle;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class myClassLoader extends ClassLoader {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException {
try {
/* Class test = new myClassLoader().loadClass("com.miracle.test.Conf", "E:\\test.jar");
Field[] field = test.getFields();
for (Field f : field) {
System.out.println(f.getName());
}*/
String className = "com.miracle.Test";
String warpath = "E:\\Ano.war";
Class t2 = new myClassLoader().loadClassFromWar("WEB-INF.classes." + className, warpath);
Field[] field = t2.getDeclaredFields();
// Class ano = new myClassLoader().loadClassFromWar("WEB-INF.classes.com.miracle.MyAno", warpath);
// Method m = ano.getMethod("value");
// ano.getAnnotation(String.class);
// Annotation a;
for (Field f : field) {
System.out.println(f.getName());
MyAno ano = f.getAnnotation(MyAno.class);
System.out.println(ano.value());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Class loadClassFromWar(String className, String warpath) throws ClassNotFoundException {
Class result = null;
byte[] classData = null;
try {
classData = getByteArrayFromWarFile(className, warpath);
result = defineClass(className.replace("WEB-INF.classes.", ""), classData, 0, classData.length);
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
private byte[] getByteArrayFromWarFile(String className, String warpath) {
int len;
byte buffer[] = new byte[1024];
ZipFile zipfile = null;
try {
zipfile = new ZipFile(warpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
className = className.replace('.', '/');
System.out.println(className);
try {
ZipEntry zipEntry = zipfile.getEntry(className + ".class");
if (zipEntry != null) {
System.out.println("zipEntry:" + zipEntry.getName());
try {
InputStream inputStream = zipfile.getInputStream(zipEntry);
int arrayLength = inputStream.available();
byte[] bytes = new byte[arrayLength];
int pos = 0;
while (true) {
int n = inputStream.read(bytes, pos, arrayLength - pos);
if (n <= 0)
break;
pos += n;
}
inputStream.close();
return bytes;
} catch (IOException exp) {
exp.printStackTrace();
}
} else {
System.out.println("not found");
}
} catch (Exception ex) {
//ex.printStackTrace();
return null;
}
return null;
}
public Class loadClass(String className, String jarpath) throws ClassNotFoundException {
Class result = null;
byte[] classData = null;
try {
classData = getByteArrayFromJarFile(className, jarpath);
result = defineClass(className, classData, 0, classData.length);
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
private byte[] getByteArrayFromJarFile(String className, String jarpath) {
int len;
byte buffer[] = new byte[1024];
JarFile jarFile = null;
try {
jarFile = new JarFile(jarpath);
} catch (Exception ex) {
}
className = className.replace('.', '/');
try {
ZipEntry zipEntry = jarFile.getEntry(className + ".class");
if (zipEntry != null) {
try {
InputStream inputStream = jarFile.getInputStream(zipEntry);
int arrayLength = inputStream.available();
byte[] bytes = new byte[arrayLength];
int pos = 0;
while (true) {
int n = inputStream.read(bytes, pos, arrayLength - pos);
if (n <= 0)
break;
pos += n;
}
inputStream.close();
return bytes;
} catch (IOException exp) {
exp.printStackTrace();
}
}
} catch (Exception ex) {
//ex.printStackTrace();
return null;
}
return null;
}
}
反射应用(读取war包、jar包里的类,获得annotation的值)
最新推荐文章于 2022-05-29 11:39:00 发布