`
Goro
  • 浏览: 173110 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

从不含package名的class名 取得 含package名的class名

    博客分类:
  • Java
阅读更多
比如1)
有个类叫
a.b.c.MyClass

输入1个字符串"MyClass" 返回字符串"a.b.c.MyClass"

比如2)
有重名的情况,全部返回
有两个类
a.b.c.MyClass
x.y.z.MyClass


输入1个字符串"MyClass" 
返回字符串
"a.b.c.MyClass"

"x.y.z.MyClass"


调用方法
ArrayList<String> fullNames = FullClassNameGetter.getInstance().getFullClassName(不含包的类名);



完整代码

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
//import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;


public class FullClassNameGetter {

	private static final String JAVA_CLASS_PATH = "java.class.path";

	private static final String CLASSPATH_SEPARATOR = System.getProperty("path.separator");

	private static final String PACKAGE_SEPARATOR = ".";

	private static final String JAR_DIR_SEPARATOR = "/";

	private static final String CLASS_SUFFIX = ".class";

	private HashMap<String, ArrayList<String>> nameingMap;

	private String[] jdkJars = {"lib/rt.jar",
			"lib/jsse.jar",
			"lib/jce.jar",
			"lib/charsets.jar",
			"lib/ext/dnsns.jar",
			"lib/ext/localedata.jar",
			"lib/ext/sunjce_provider.jar",
			"lib/ext/sunmscapi.jar",
			"lib/ext/sunpkcs11.jar"};

	private static class FullClassNameGetterSingletonHolder {
		private static FullClassNameGetter instance = new FullClassNameGetter();
	}

	private FullClassNameGetter() {
		final String initialClasspath = System.getProperty(JAVA_CLASS_PATH);
		//Date now = new Date();
		setClassPath(initialClasspath);
		//System.out.println("initialize FullClassNameGetter done.  " + (new Date().getTime() - now.getTime()));
	}

	public static FullClassNameGetter getInstance() {
		return FullClassNameGetterSingletonHolder.instance;
	}

	public ArrayList<String> getFullClassName(String className) {
		ArrayList<String> ret = null;
		if (className.indexOf(PACKAGE_SEPARATOR) != -1) {
			ret = new ArrayList<String>();
			ret.add(className);
			return ret;
		}


		ret = nameingMap.get(className);
		return ret;
	}

	public void setClassPath(String classPath) {
		nameingMap = new HashMap<String, ArrayList<String>>();
		String[] classPathArray = classPath.split(CLASSPATH_SEPARATOR);

		File file;
		for (String onePath : classPathArray) {
			file = new File(onePath);
			if (file.exists()) {
				if (file.isDirectory()) {
					// dir
					setDirClasses(file, "");
				} else {
					// jar file
					setJarClasses(file);
				}
			}
		}
		String jreDir = System.getProperty("java.home");
		for (String jreJar : jdkJars) {
			file = new File(jreDir + JAR_DIR_SEPARATOR + jreJar);
			if (file.exists()) {
				// jar file
				setJarClasses(file);
			}
		}

	}

	private void setDirClasses(File classDir, String path) {
        File[] files = classDir.listFiles();
        String className;
        for (File file : files) {
            if (file.isDirectory()) {
            	setDirClasses(file, path + file.getName() + PACKAGE_SEPARATOR);
            } else {
            	if (file.getName().endsWith(CLASS_SUFFIX)) {
            		className  = file.getName().substring(0, file.getName().length() - CLASS_SUFFIX.length());
            		if (!"".equals(path)) {
            			setNamingMap(className, path + className);
            		} else {
            			//no package
            			setNamingMap(className, className);
            		}
            	}
            }
        }
	}

	private void setJarClasses(File jarFile) {
		JarFile jf = null;
        try {
            jf = new JarFile(jarFile);

            Enumeration<JarEntry> es = jf.entries();
            JarEntry entry;
            String simpleName;
            while (es.hasMoreElements()) {
            	entry = es.nextElement();
            	if (!entry.isDirectory()) {
            		String fullName = entry.getName();
            		if (fullName.endsWith(CLASS_SUFFIX)) {
            			fullName = fullName.substring(0, fullName.length() - CLASS_SUFFIX.length());
                        int index = fullName.lastIndexOf(JAR_DIR_SEPARATOR);
                        if (index != -1) {
                        	simpleName = fullName.substring(index + 1, fullName.length());
                        	fullName = fullName.replace(JAR_DIR_SEPARATOR, PACKAGE_SEPARATOR);
                        	setNamingMap(simpleName, fullName);
                        } else {
                        	//no package
                        	simpleName = fullName;
                        	setNamingMap(simpleName, fullName);
                        }
            		}
            	}
            }
        } catch (IOException e) {
        	//do nothing
        } finally {
            if (jf != null) {
                try {
                    jf.close();
                } catch (IOException e) {
                	//do nothing
                }
            }
        }
	}

	private void setNamingMap(String simpleName, String fullName) {
		ArrayList<String> value = nameingMap.get(simpleName);
		if (value == null) {
			value = new ArrayList<String>();
			nameingMap.put(simpleName, value);
		}
		if (!value.contains(fullName)) {
			value.add(fullName);
		}
	}


}
0
0
分享到:
评论
2 楼 Goro 2012-02-26  
enet_java 写道
不错,不过不明白lZ为什么要通过这种方式来获取实例呢?给解释一下呗。多谢了

引用
    private static class FullClassNameGetterSingletonHolder
    {
        private static FullClassNameGetter instance = new FullClassNameGetter();
    }
    public static FullClassNameGetter getInstance()
    {
        return FullClassNameGetterSingletonHolder.instance;
    }



参考下面的文章
Initialization on demand holder
http://book.51cto.com/art/201202/318464.htm

如果只简单用static的成员变量来实现单例模式,不能实现延迟加载。
当然这是个小问题。 除非构造这个对象需要很大开销。

1 楼 enet_java 2010-12-22  
不错,不过不明白lZ为什么要通过这种方式来获取实例呢?给解释一下呗。多谢了

引用
    private static class FullClassNameGetterSingletonHolder
    {
        private static FullClassNameGetter instance = new FullClassNameGetter();
    }
    public static FullClassNameGetter getInstance()
    {
        return FullClassNameGetterSingletonHolder.instance;
    }

相关推荐

    package-info.class

    package-info.class

    Launcher.rar Intent 外部APP 將 Package Name 與 Class Name 透過 intent 方法代入

    已知 B 程式的 Package Name 與要啟動的 Class Name,則直接在 下載此源碼 程式中,將 Package Name 與 Class Name 透過 intent 方法代入,並 startActivity 該 Intent 即可

    DOS命令运行和编译带有package包名的java程序

    4. 使用`java &lt;package&gt;.&lt;classname&gt;`命令运行编译后的程序,`&lt;package&gt;`是包名,`&lt;classname&gt;`是类名。 这个过程对于理解Java程序的组织结构和DOS命令的使用具有重要意义,也是每个Java开发者必备的基础技能。

    关于java中package的设置

    所有的class成员名劫被互相隔绝。class A的 函数f(),其名称不会和class B()中具有相同标记式的f()相冲突。与此相类似,为了不使class名称发生冲突,于是引入了package 进行管理。 所谓程序库就是一组class文件。...

    Eclipse中在项目或src上点右键new时没有 class和package解决方法

    Eclipse中在项目或src上点右键new时没有 class和package解决方法,

    Java 中的 ClassPath 和 Package

    在创建可执行的`.jar`文件时,通常会包含一个名为`MANIFEST.MF`的配置文件,其中的`Main-Class`属性指定程序的入口点。这使得可以通过`java -jar myapp.jar`来直接运行打包后的应用。 总结起来,Java的ClassPath是...

    ExcelPackage_ExcelPackage_unityC#Excel_源码

    这段代码创建了一个新的Excel文件,添加了一个名为"Sheet1"的工作表,并填充了两行数据。 在Unity中,你还可以结合ExcelPackage生成相关的数据代码。例如,可以读取Excel中的配置表,然后自动生成C#类或者JSON文件...

    matlab-json-master This package contains Matlab class to

    matlab-json-master This package contains Matlab class to serializedecode matlab object in json format..zip

    java中package用法详解

    2. **包的声明**:使用`package`关键字,并将Java源文件置于与包名一致的目录结构中。 3. **编译与路径**:使用`javac`命令时,确保正确指定`-d`选项以生成正确的目录结构。 4. **Classpath设置**:确保项目依赖的...

    Allegro-Class(类)SubClass(子类)层功能介绍 .docx

    Package Geometry 在焊盘图形中的图形,在焊盘图形中添加的标识、说明、注释等信息应添加到该类的子类上。ASSEMBLY-TOP 和 ASSEMBLY-BOTTOM 是与装配相关的内容,表示的是零件的外形和方向。PLACE-BOUND-TOP 和 ...

    存取Package,3个Class

    public class CustomerTest { public static void main(String[] args) { Customer cust = new Customer("jane","smith"); Account acct = new Account(1000,2000,0.0123); cust.setAccount(acct); ...

    java中package和import的作用

    在Java编程语言中,`package`和`import`是非常重要的两个概念,它们分别用于组织代码结构和引入外部类或包,对于理解Java程序的模块化和包管理机制至关重要。 ### Java中的Package #### 1. Package的概念 在Java中...

    package与import机制.pdf

    1. **包的声明**:在Java源文件的第一行使用`package`关键字声明包名。 2. **路径对应**:Java文件和类文件必须放置在其所属包对应的目录结构中。 3. **编译与执行**:编译器会根据包路径找到类文件;运行时也需要...

    安卓获取apk包名类名

    这将返回类似`package:/data/app/&lt;package_name&gt;=/path/to/apk_file.apk`的结果,其中 `&lt;package_name&gt;` 就是包名。 2. **反编译APK**:使用工具如JAR解压器或专门的APK分析工具(如Apktool、dex2jar等),可以反...

    MyEclipse中直接查看.class文件

    在MyEclipse中直接查看.class文件是开发过程中的一项实用技能,尤其当源代码不可用时。这个过程涉及到安装和配置反编译工具以及相应的插件。以下是对如何在MyEclipse中实现这一功能的详细说明: 首先,需要下载两个...

    扫描指定包下的class,并将javaBean对象动态注册到spring环境中

    provider.addIncludeFilter(new AnnotationTypeFilter(MyAnnotation.class)); // 假设MyAnnotation是我们关注的注解 for (BeanDefinition bean : provider.findCandidateComponents("com.example.myapp")) { // ...

    package com.test;package com.test;package com.test;package com.test;

    public class B { public static void main(String[] args) { File file = new File("c:\\a.jpg"); FileInputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException...

    修改jar包中的class文件

    这些文件被组织成与Java包(package)相匹配的目录结构。当我们运行一个JAR文件时,Java虚拟机(JVM)会加载其中的class文件并执行其中的代码。 修改JAR文件中的class文件涉及以下几个步骤: 1. **解压JAR文件**:...

    Java 的 Class Path 和 Package

     当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,运行, 等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find class HelloWorld 或者 Exception in thread main ...

Global site tag (gtag.js) - Google Analytics