系统中有个基类接口例如AType.class,那么如果有个BType implements AType,那么只要用if instanceof来判断就行了。现在问题是,用户开发了一个CType implements AType,然后编译做成一个.jar包了,作为一个文件传了过来,我用流的方式读进了这个文件,那么我该怎么做才能知道这个.jar包中的这个CType.class是否是instanceof AType?

解决方案 »

  1.   

    反射 kava.lang.reflect包下的类
    *****.getClass.getInterfaces()
    or
    Class c = Class.forName(******);
    c.getInterfaces();得到interface 就可以instanceof AType
    我没试 不知道行不行给你提供个参考吧
      

  2.   

    /**
     * 检查一个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
      

  3.   

    接口也给你个例子吧。
    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());
    }
    }

    }
      

  4.   


    *****.getClass().getInterfaces()这样写
    yjgoo199()的例子还不错
    不过判断是不是继承自某个类
    使用instanceof or isInstance比较简单一些吧
      

  5.   

    这些反射的代码我都知道,也都会。
    现在主要问题是用户的类是个文件,不是系统中有的,所以不确定反射的代码是否可用。xizhiyao(流浪的猴子) 说
    *****.getClass().getInterfaces()这样写那么问题就是,这个*****是什么,是一个.jar包文件中的一个文件,不是具体存在的一个实例,所以我觉得.getClass()不能用。
    你可以测一下,自己随便写个类,做成.jar包,然后另外开一个项目,读取这个文件,File f = new File("c:/aaa.jar"),然后你试试看。还有Class c = Class.forName(******);
    同样问题,可以写******=xxx.CType,你直接试试看这个代码,肯定说Class.forName出错,这个名字不存在。总的就是说,这个.jar包是用户动态传过来的,因此不是在你这个项目中引用的,所以不确定那些反射等是否可用。谁能给个具体一点的代码,从文件中读出这个类开始。
      

  6.   

    是不是我智商太低了 
    作成.JAR包 然后用file读取(OR 放入流中传输)意义何在(难道 LZ您制作成JAR只是为了压缩 那您直接如何判断 压缩包中文件比较清楚些吧)请LZ明示
    我制作的jar不是用于classpath 就是加入到 web-inf/lib下了 没试过用i/o读取(sorry智商低玩不了有创意东西)还有LZ
    我考虑您把用户传的jar包 保存在您的classpath里(web-inf/lib下)这样您的服务器设置为支持类的动态加载,这样就可以使用您不屑的反射了用户传给您个jar包 是处于什么考虑的呢? 这个jar包将怎么用呢?望LZ不吝赐教LZ我欠你什么吗?做人要厚道
      

  7.   

    反射反射 kava.lang.reflect包下的类
    *****.getClass.getInterfaces()
    or
    Class c = Class.forName(******);
    c.getInterfaces();
      

  8.   

    ClassLoader cl=new  ClassPathLoader(new ClassPath("c:/aaa.jar"));
     Class c=cl.loadClass("xxxx");
      

  9.   

    不能用io流的,如果是socket中读过来的流,那么先写成文件吧。
      

  10.   

    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);
        }
    }
      

  11.   

    bao110908(长牙了,好痛)
    这方法好
      

  12.   

    ClassLoader cl=new  ClassPathLoader(new ClassPath("c:/aaa.jar"));
     Class c=cl.loadClass("xxxx");
    原谅我孤陋寡闻
    ClassPathLoader与ClassPath这两个类我在API里面怎么找不到?
      

  13.   

    ClassPathLoader、ClassPath 是第三方类库中的,不是 J2SE 中的类。
      

  14.   

    import sun.rmi.rmic.iiop.ClassPathLoader;
    import sun.tools.java.ClassPath;eclipse里面自动导入的
      

  15.   

    哦,找到了 是tools.jar里面的
      

  16.   

    谢谢xizhiyao(流浪的猴子) 的参与。我这个目的是,可以让用户动态的增加一些组件,但是要求用户自己开发的这些组件必须继承系统里的一些底层的接口,这样才可能通过修改一些配置文件,就可以调用用户的组件了。
    比如有个A接口,里面有process方法,然后系统默认用一个B类来处理,调用process方法。然后用户觉得要扩张了,自己写一个一个C类继承了A类,那么只要通过修改一些配置文件,那么系统执行的流程就变化了,会去掉用C类,而不是B类。并且这个操作是用户作的,不是让系统管理员做的。就是这个目的。
    因为服务器是jboss的,可以动态加载新的jar包的。一会我再试试看ClassLoader的东西。
      

  17.   

    还有一点忘记说了,这个目的就是在用户提供上传的jar包的时候,做一个验证,验证一下用户的包里面的类,是不是继承了系统里的基类。如果没有一个是继承基类的,那么就不让用户继续配置下去了。
      

  18.   

    对于反射,我不是不屑使用,而是不能用。
    动态加载,也考虑过,是个可行的方法,但是有一点点不好的地方,jar包放进去以后,要等多少时间它才能加载完成,虽然不会要很多时间,但是也不是马上加载完成的。所以这么用的话,我只能默认等个10秒。这样有点不确定性,所以不想这么用。
    还有如果发布时候,要现发布a.jar,然后才能发布b.jar,但是要验证的只在b.jar里面,这就麻烦一点。
    以及验证失败的话,还要删掉,种种麻烦。
      

  19.   

    bao110908(长牙了,好痛)的方法很好
      

  20.   

    ClassPathLoader、ClassPath 好象是apache的一个开源项目  
    我在这找到API
    http://www.langhua.cn/ofbiz-javadoc/还是感觉 LZ您让用户上传jar包到服务器那边 就算是验证了下是否继承 也还是非常不安全的