- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个代码库,我想生成几个可交付的 jar 文件,每个文件都将从命令行运行并访问代码库的某些功能。运行时,一些命令行参数是 jar 中的其他类,然后通过反射创建这些类。它工作得很好,但我必须指定非常长的类完全限定路径,即使类在 jar 文件中也是如此。
我正在使用 ant 编译然后 jar 一系列目录。从最小的示例 build.xml 文件:
<property name="build" location="build"/>
<property name="jars" location="${build}/jars"/>
<property name="classes" location="${build}/classes"/>
<property name="src" location="src/dom/place/proj"/>
<target name="utility">
<javac
includeantruntime="false"
srcdir="${src}/utility" destdir="${classes}"
classpathref="classpath" />
<jar
destfile="${jars}/utility.jar"
basedir="${classes}"
includes="**/utility/**" />
</target>
<target name="tokenizers" depends="utility">
<javac
includeantruntime="false"
srcdir="${src}/tokenizers"
destdir="${classes}"
classpathref="classpath" />
<jar
destfile="${jars}/tokenizers.jar"
basedir="${classes}"
includes="**/tokenizers/**" />
</target>
稍后,我将创建一个 jar 文件,其中包含所有需要的类并将运行一个命令,例如:
<target name="tokenize-file-jar">
<jar destfile="${dist}/TokenizeFile.jar">
<zipgroupfileset dir="${jars}">
<include name="utility.jar"/>
<include name="tokenizers.jar"/>
</zipgroupfileset>
<manifest>
<attribute name="Main-Class" value="dom.place.proj.tokenizers.TokenizeFile"/>
</manifest>
</jar>
</target>
一切正常,查看 jar 文件,所有类都在那里。
prompt > unzip -l TokenizeFile.jar
Archive: TokenizeFile.jar
Length Date Time Name
-------- ---- ---- ----
0 01-11-12 11:07 META-INF/
286 01-11-12 11:07 META-INF/MANIFEST.MF
0 01-11-12 10:16 dom/
0 01-11-12 10:16 dom/place/
0 01-11-12 10:16 dom/place/proj/
0 01-11-12 10:16 dom/place/proj/tokenizers/
1737 01-11-12 11:07 dom/place/proj/tokenizers/FileTokenizer.class
1411 01-11-12 11:07 dom/place/proj/tokenizers/PorterTokenizer.class
1754 01-11-12 11:07 dom/place/proj/tokenizers/TokenizeFile.class
992 01-11-12 11:07 dom/place/proj/tokenizers/Tokenizer.class
0 01-11-12 10:16 dom/place/proj/utility/
1106 01-11-12 11:07 dom/place/proj/utility/BoundedExecutor.class
3128 01-11-12 11:07 dom/place/proj/utility/Converter.class
1107 01-11-12 11:07 dom/place/proj/utility/ExceptionHandler.class
现在,为了运行代码,我这样做:
java -jar TokenizeFile.jar test.txt dom.place.proj.tokenizers.FileTokenizer dom.place.proj.tokenizers.PorterTokenizer
并且有效。耶!但我希望我的客户不必在命令行上为每个类指定完全限定名称——这是一个小示例,可能有很多项。我可以在我的代码或构建过程中更改什么以允许这样做:
java -jar TokenizeFile.jar test.txt FileTokenizer PorterTokenizer
感谢您的帮助。我正在从 C++/make 过渡,到目前为止非常喜欢 ant 和 Java。
最佳答案
简短的回答是这是不可能的;类名也仅在给定它们的包时才明确。
让调用者更简单的一个选择是让您的应用程序在它们提供的每个类参数前添加 "dom.place.proj.tokenizers."
- 因此您的较短的首选示例的行为与第一个。
然而,随着简单性的提高,功能也会减弱;用户将不再可能定义自己的自定义类并将其传入,因为包不匹配。 (在某种程度上,如果类名不包含句点 (.
),您可以通过仅在默认包前面添加来解决此问题,但是您添加的特殊情况越多,理解起来就越困难...)
您提到您正在过渡到 Java。归根结底,我会期望在类出现在这种情况下时以其完整的包前缀名称指定类,因此缩写版本可能会让使用过的人更加困惑到 Java。
因此,我的建议是保持现状,基本上,更加习惯命令行的第一个版本。即使您要解决这种特殊情况下的问题,也有许多其他第一方和第三方 Java 应用程序和工具需要在命令行上指定类 - 而且它们都需要完全限定的类名也是。
如果这看起来不太像一个答案,我深表歉意,但我相信这是在这种情况下最好的行动方案。
关于java - 在交付单个 jar 并使用反射时,如何避免在命令行中指定完全限定的类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823326/
一、反射 1.定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(即使是私有的);对于任意一个对象,都能够调用它的任意方法和属性,那么,我
有没有办法从 JavaScript 对象内部获取所有方法(私有(private)、特权或公共(public))?这是示例对象: var Test = function() { // private m
我有一个抽象类“A”,类“B”和“C”扩展了 A。我想在运行时根据某些变量创建这些实例。如下所示: public abstract class A { public abstract int
假设我们在内存中有很多对象。每个都有一个不同的ID。如何迭代内存以找到与某些 id 进行比较的特定对象?为了通过 getattr 获取并使用它? 最佳答案 您应该维护这些对象的集合,因为它们是在类属性
假设我有这个结构和一个方法: package main import ( "fmt" "reflect" ) type MyStruct struct { } func (a *MyS
C#反射简介 反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。 反射是一种在.NET Framework中广
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段、方法、构造函数等)的能力。通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态
先来看一段魔法吧 public class Test { private static void changeStrValue(String str, char[] value) {
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型
反射 1. 反射的定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们
反射的定义 java的反射(reflection) 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到嘛,那么,我们就可以
我有一个 Java POJO: public class Event { private String id; private String name; private Lon
我编写了以下函数来检查给定的单例类是否实现了特征。 /** Given a singleton class, returns singleton object if cls implements T.
我正在研究 Java 反射的基础知识并观察有关类方法的信息。我需要获得一个符合 getMethod() 函数描述的规范的方法。然而,当我这样做时,我得到了一个 NoSuchMethodExceptio
我正在通过以下代码检索 IEnumerable 属性列表: BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public
我需要检查属性是否在其伙伴类中定义了特定属性: [MetadataType(typeof(Metadata))] public sealed partial class Address { p
我正在尝试使用 Reflections(由 org.reflections 提供)来处理一些繁重的工作,因此我不需要在很长的时间内为每个类手动创建一个实例列表。但是,Reflections 并未按照我
scala 反射 API (2.10) 是否提供更简单的方法来搜索加载的类并将列表过滤到实现定义特征的特定类? IE; trait Widget { def turn(): Int } class
我想在运行时使用反射来查找具有给定注释的所有类,但是我不知道如何在 Scala 中这样做。然后我想获取注释的值并动态实例化每个映射到关联注释值的带注释类的实例。 这是我想要做的: package pr
这超出了我的头脑,有人可以更好地向我解释吗? http://mathworld.wolfram.com/Reflection.html 我正在制作一个 2d 突破格斗游戏,所以我需要球能够在它击中墙壁
我是一名优秀的程序员,十分优秀!