反射 kava.lang.reflect包下的类 *****.getClass.getInterfaces() or Class c = Class.forName(******); c.getInterfaces();得到interface 就可以instanceof AType 我没试 不知道行不行给你提供个参考吧
晕 *****.getClass().getInterfaces()这样写 yjgoo199()的例子还不错 不过判断是不是继承自某个类 使用instanceof or isInstance比较简单一些吧
这些反射的代码我都知道,也都会。 现在主要问题是用户的类是个文件,不是系统中有的,所以不确定反射的代码是否可用。xizhiyao(流浪的猴子) 说 *****.getClass().getInterfaces()这样写那么问题就是,这个*****是什么,是一个.jar包文件中的一个文件,不是具体存在的一个实例,所以我觉得.getClass()不能用。 你可以测一下,自己随便写个类,做成.jar包,然后另外开一个项目,读取这个文件,File f = new File("c:/aaa.jar"),然后你试试看。还有Class c = Class.forName(******); 同样问题,可以写******=xxx.CType,你直接试试看这个代码,肯定说Class.forName出错,这个名字不存在。总的就是说,这个.jar包是用户动态传过来的,因此不是在你这个项目中引用的,所以不确定那些反射等是否可用。谁能给个具体一点的代码,从文件中读出这个类开始。
反射反射 kava.lang.reflect包下的类 *****.getClass.getInterfaces() or Class c = Class.forName(******); c.getInterfaces();
ClassLoader cl=new ClassPathLoader(new ClassPath("c:/aaa.jar")); Class c=cl.loadClass("xxxx");
不能用io流的,如果是socket中读过来的流,那么先写成文件吧。
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream;import java.util.jar.JarEntry; import java.util.jar.JarFile;public class Test { public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException { JarFile jar = new JarFile("Java2Demo.jar"); JarEntry entry = jar.getJarEntry("java2d/DemoFonts.class");
InputStream is = jar.getInputStream(entry); ByteArrayOutputStream bao = new ByteArrayOutputStream(); int r=0; while((r=is.read())!=-1) { bao.write(r); } byte[] b = bao.toByteArray();
MyClassLoader cl = new MyClassLoader(b); Class c = cl.findClass(entry.getName().replace("/", ".").replace(".class", "")); Object obj = c.newInstance(); System.out.println(obj instanceof Runnable); is.close(); jar.close(); } }class MyClassLoader extends ClassLoader { private byte[] b; public MyClassLoader(byte[] b) { this.b = b; } public Class<?> findClass(String name) { return defineClass(name, b, 0, b.length); } }
bao110908(长牙了,好痛) 这方法好
ClassLoader cl=new ClassPathLoader(new ClassPath("c:/aaa.jar")); Class c=cl.loadClass("xxxx"); 原谅我孤陋寡闻 ClassPathLoader与ClassPath这两个类我在API里面怎么找不到?
*****.getClass.getInterfaces()
or
Class c = Class.forName(******);
c.getInterfaces();得到interface 就可以instanceof AType
我没试 不知道行不行给你提供个参考吧
* 检查一个Class是否继承PO类
* @return po 是则返回 true,否则为 false
*/
public boolean isExtendsPo(Class c){
Class superC=c.getSuperclass();
String name;
try{
name=superC.getName();
}catch(NullPointerException e){
return false;
}
if(name.equals("org.im.po.Po")){
return true;
}else{
isExtendsPo(superC);//使用递归来判断
}
return false;
}以前用在一个小项目中的一段代码,判断是否直接或间接继承自org.im.po.Po
package test;interface AA{
}public class Test implements AA{
public static void main(String[] args) {
Class[] c=Test.class.getInterfaces();
for(Class cl : c){
System.out.println(cl.getName());
}
}
}
*****.getClass().getInterfaces()这样写
yjgoo199()的例子还不错
不过判断是不是继承自某个类
使用instanceof or isInstance比较简单一些吧
现在主要问题是用户的类是个文件,不是系统中有的,所以不确定反射的代码是否可用。xizhiyao(流浪的猴子) 说
*****.getClass().getInterfaces()这样写那么问题就是,这个*****是什么,是一个.jar包文件中的一个文件,不是具体存在的一个实例,所以我觉得.getClass()不能用。
你可以测一下,自己随便写个类,做成.jar包,然后另外开一个项目,读取这个文件,File f = new File("c:/aaa.jar"),然后你试试看。还有Class c = Class.forName(******);
同样问题,可以写******=xxx.CType,你直接试试看这个代码,肯定说Class.forName出错,这个名字不存在。总的就是说,这个.jar包是用户动态传过来的,因此不是在你这个项目中引用的,所以不确定那些反射等是否可用。谁能给个具体一点的代码,从文件中读出这个类开始。
作成.JAR包 然后用file读取(OR 放入流中传输)意义何在(难道 LZ您制作成JAR只是为了压缩 那您直接如何判断 压缩包中文件比较清楚些吧)请LZ明示
我制作的jar不是用于classpath 就是加入到 web-inf/lib下了 没试过用i/o读取(sorry智商低玩不了有创意东西)还有LZ
我考虑您把用户传的jar包 保存在您的classpath里(web-inf/lib下)这样您的服务器设置为支持类的动态加载,这样就可以使用您不屑的反射了用户传给您个jar包 是处于什么考虑的呢? 这个jar包将怎么用呢?望LZ不吝赐教LZ我欠你什么吗?做人要厚道
*****.getClass.getInterfaces()
or
Class c = Class.forName(******);
c.getInterfaces();
Class c=cl.loadClass("xxxx");
import java.io.IOException;
import java.io.InputStream;import java.util.jar.JarEntry;
import java.util.jar.JarFile;public class Test {
public static void main(String[] args) throws IOException,
InstantiationException, IllegalAccessException { JarFile jar = new JarFile("Java2Demo.jar");
JarEntry entry = jar.getJarEntry("java2d/DemoFonts.class");
InputStream is = jar.getInputStream(entry);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
int r=0;
while((r=is.read())!=-1) {
bao.write(r);
}
byte[] b = bao.toByteArray();
MyClassLoader cl = new MyClassLoader(b);
Class c = cl.findClass(entry.getName().replace("/", ".").replace(".class", "")); Object obj = c.newInstance();
System.out.println(obj instanceof Runnable); is.close();
jar.close();
}
}class MyClassLoader extends ClassLoader {
private byte[] b;
public MyClassLoader(byte[] b) {
this.b = b;
}
public Class<?> findClass(String name) {
return defineClass(name, b, 0, b.length);
}
}
这方法好
Class c=cl.loadClass("xxxx");
原谅我孤陋寡闻
ClassPathLoader与ClassPath这两个类我在API里面怎么找不到?
import sun.tools.java.ClassPath;eclipse里面自动导入的
比如有个A接口,里面有process方法,然后系统默认用一个B类来处理,调用process方法。然后用户觉得要扩张了,自己写一个一个C类继承了A类,那么只要通过修改一些配置文件,那么系统执行的流程就变化了,会去掉用C类,而不是B类。并且这个操作是用户作的,不是让系统管理员做的。就是这个目的。
因为服务器是jboss的,可以动态加载新的jar包的。一会我再试试看ClassLoader的东西。
动态加载,也考虑过,是个可行的方法,但是有一点点不好的地方,jar包放进去以后,要等多少时间它才能加载完成,虽然不会要很多时间,但是也不是马上加载完成的。所以这么用的话,我只能默认等个10秒。这样有点不确定性,所以不想这么用。
还有如果发布时候,要现发布a.jar,然后才能发布b.jar,但是要验证的只在b.jar里面,这就麻烦一点。
以及验证失败的话,还要删掉,种种麻烦。
我在这找到API
http://www.langhua.cn/ofbiz-javadoc/还是感觉 LZ您让用户上传jar包到服务器那边 就算是验证了下是否继承 也还是非常不安全的