如何创建不知道名字的类的实例 有这样一个需求:1,我把类A和B打入同一个jar包中。2,类A要访问类B但是不知道类B的名字,知道的是类B的包名。那么我如何取到B所在包下所有类的名字或实例呢?谢谢~! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 File file=new File("D:/workspace/study/src/test/"); //包的路径 if(file.isDirectory()){ File[] files=file.listFiles(); //取得包中的所有文件 for (int i=0;i<files.length;i++){ String classname=files[i].getName();//取文件名 xxx.class classname=classname.substring(0,classname.indexOf("."));//去掉.class if(classname.indexOf("B")<0){//如果文件名不是B 则创建A的实例 //System.out.println(classname); Object oj =Class.forName(classname).newInstance();//创建实例 } } } 多谢,不过现在两个类都在同一个jar包中,这样怎么做啊,比如D:/workspace/study/src/test/XX.jar在jar中有这样结构 XX/e1/A.class /e2/B.class 写了一个简单的示例大致思路就是这样了,情况复杂的话可自行更改package a;import java.io.File;import java.net.URI;import java.net.URL;/* * 本类A处于包a下,a的平行目录有一个包b,b中有2个类B,C * 包a,b都处于classes下 */public class A { /** * 获取指定包下面的所有类 * 假设已经知道包名为b,需要获取到b内所有类的名字。目前内有2个类B,C * @param args * @author liqiao */ public String getAllClass() throws Exception{ URL url = A.class.getClassLoader().getResource(""); URI uri = url.toURI(); //去掉uri中的前6个字符file:/ String rootPath = uri.toString().substring(6, uri.toString().length()); //组装需要的的包路径 rootPath = rootPath + "b"; File file = new File(rootPath); StringBuffer sb = new StringBuffer(); if (file.exists() && file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { String fileName = files[i].getName(); int position = fileName.indexOf("."); String ext = fileName.substring(position, fileName.length()); if (ext != null && ".class".equals(ext)) { sb.append(fileName); sb.append(";"); } } } if(sb.toString().length() == 0) { return "The dic is null!"; } else{ return sb.toString().substring(0, sb.toString().length() - 1); } } public static void main(String[] args) throws Exception{ A a = new A(); //运行结果为B.class;C.class System.out.println(a.getAllClass()); }} 改了下,直接用uri来获取到包目录package a;import java.io.File;import java.net.URI;import java.net.URL;/* * 本类A处于包a下,a的平行目录有一个包b,b中有2个类B,C * 包a,b都处于classes下 */public class A { /** * 获取指定包下面的所有类 * 假设已经知道包名为b,需要获取到b内所有类的名字。目前内有2个类B,C * @param args * @author liqiao */ public String getAllClass() throws Exception{ URL url = A.class.getClassLoader().getResource("b"); URI uri = url.toURI(); File file = new File(uri); StringBuffer sb = new StringBuffer(); if (file.exists() && file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { String fileName = files[i].getName(); int position = fileName.indexOf("."); String ext = fileName.substring(position, fileName.length()); if (ext != null && ".class".equals(ext)) { sb.append(fileName); sb.append(";"); } } } if(sb.toString().length() == 0) { return "The dic is null!"; } else{ return sb.toString().substring(0, sb.toString().length() - 1); } } public static void main(String[] args) throws Exception{ A a = new A(); //运行结果为B.class;C.class System.out.println(a.getAllClass()); }} 谢谢楼上,已经解决问题。还有一个小问题,你的解法是专为读取jar包内类这样的需求设计的么?读取jar内资源和读取jar外资源是两种问题吧。 不是转为读取jar包内类写的,你自己没事在IDE里开发一样可以用一样的,都是放到classpath里而已,jar包也没什么特殊的 group.setProperties(user); 为什么设置失败。 相当重要的问题 高手在哪儿呢? 请进 前辈们快来帮忙啊!JDBC数据库语言问题。 我刚刚开始练习作JAVA程序,用什么可视化开发工具好呢? Collection问题 SQL JDBC 如何判断JCheckBox的状态?急,,,急 如何不让垃圾回收类的实例?? 关于Socket编程里面的问题 想下载 高手解决---- windows 服务 调用 tomcat 的问题 , 不显示tomcat 黑窗体 ~~~~~在线等!!!!! 继承AbstractTableModel 问题?
File file=new File("D:/workspace/study/src/test/"); //包的路径
if(file.isDirectory()){
File[] files=file.listFiles(); //取得包中的所有文件
for (int i=0;i<files.length;i++){
String classname=files[i].getName();//取文件名 xxx.class
classname=classname.substring(0,classname.indexOf("."));//去掉.class
if(classname.indexOf("B")<0){//如果文件名不是B 则创建A的实例
//System.out.println(classname);
Object oj =Class.forName(classname).newInstance();//创建实例
}
}
}
多谢,不过现在两个类都在同一个jar包中,这样怎么做啊,比如D:/workspace/study/src/test/XX.jar
在jar中有这样结构 XX/e1/A.class
/e2/B.class
import java.net.URI;
import java.net.URL;
/*
* 本类A处于包a下,a的平行目录有一个包b,b中有2个类B,C
* 包a,b都处于classes下
*/
public class A {
/**
* 获取指定包下面的所有类
* 假设已经知道包名为b,需要获取到b内所有类的名字。目前内有2个类B,C
* @param args
* @author liqiao
*/
public String getAllClass() throws Exception{
URL url = A.class.getClassLoader().getResource("");
URI uri = url.toURI();
//去掉uri中的前6个字符file:/
String rootPath = uri.toString().substring(6, uri.toString().length());
//组装需要的的包路径
rootPath = rootPath + "b";
File file = new File(rootPath);
StringBuffer sb = new StringBuffer();
if (file.exists() && file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
int position = fileName.indexOf(".");
String ext = fileName.substring(position, fileName.length());
if (ext != null && ".class".equals(ext)) {
sb.append(fileName);
sb.append(";");
}
} }
if(sb.toString().length() == 0) {
return "The dic is null!";
}
else{
return sb.toString().substring(0, sb.toString().length() - 1);
}
} public static void main(String[] args) throws Exception{
A a = new A();
//运行结果为B.class;C.class
System.out.println(a.getAllClass());
}
}
import java.net.URI;
import java.net.URL;
/*
* 本类A处于包a下,a的平行目录有一个包b,b中有2个类B,C
* 包a,b都处于classes下
*/
public class A {
/**
* 获取指定包下面的所有类
* 假设已经知道包名为b,需要获取到b内所有类的名字。目前内有2个类B,C
* @param args
* @author liqiao
*/
public String getAllClass() throws Exception{
URL url = A.class.getClassLoader().getResource("b");
URI uri = url.toURI();
File file = new File(uri);
StringBuffer sb = new StringBuffer();
if (file.exists() && file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
String fileName = files[i].getName();
int position = fileName.indexOf(".");
String ext = fileName.substring(position, fileName.length());
if (ext != null && ".class".equals(ext)) {
sb.append(fileName);
sb.append(";");
}
} }
if(sb.toString().length() == 0) {
return "The dic is null!";
}
else{
return sb.toString().substring(0, sb.toString().length() - 1);
}
} public static void main(String[] args) throws Exception{
A a = new A();
//运行结果为B.class;C.class
System.out.println(a.getAllClass());
}
}
读取jar内资源和读取jar外资源是两种问题吧。