我在这里试验一下。
说我有课:
static class MyClass {
static String property = "myProperty";
}
和方法:
public static void myMethod0(Class<MyClass> clazz) {
try {
MyClass myClass = clazz.newInstance();
System.out.println (myClass.property);
} catch (Exception e) {
e.printStackTrace();
}
}
并测试它:
public static void main(String[] args ) {
myMethod0(MyClass.class);
}
myMethod0可以在这里工作,但是,我正在创建一个新实例以便到达该属性。 由于属性是静态的,我应该能够在不实际创建任何实例的情况下访问它们。例如,就像在达到静态属性时所做的那样,即 MyClass.property
总结一下: 是否可以通过Class clazz = MyClass.class?
来达到MyClass的静态属性谢谢!
**
** 将上述内容与我实际想要完成的内容相提并论:
public static class PDF_1 { public static PDF_1 it = new PDF_1();
static String contentType = "application/pdf";
static String fileEnding = "pdf";
}
static void myMethod0(PDF_1 pdf) {
System.out.println(pdf.fileEnding);
}
public enum PDF_2 {it;
static String contentType = "application/pdf";
static String fileEnding = "pdf";
}
static void myMethod1(PDF_2 pdf) {
System.out.println(pdf.fileEnding);
}
public static void main(String[] args ) {
myMethod0(PDF_1.it); // Works fine! However very verbose because of public static PDF_1 it = new PDF_1();
myMethod1(PDF_2.it); // Works fine! Somewhat verbose though because of the "it" keyword
}
关于我想用这个来完成什么的整个想法是,我经常看到人们声明了许多字符串,即:
static class Constants {
static String PDF_CONTENT_TYPE = "application/pdf";
static String PDF_FILE_ENDING = "pdf";
static String HTML_CONTENT_TYPE = "text/html";
static String HTML_FILE_ENDING = "html";
}
// There is no way knowing what type the method actually wants. Is it contentType, fileEnding or something entirely different ?
public void myMethod(String str) {
}
我想要实现的是允许你传递主类/枚举的东西,即:PDF和方法本身将决定它将使用什么。调用者只知道要传递什么,PDF或HTML类/枚举。我也在寻找这种重构友好的东西。同样有趣的是不要使这一创作的宣言复杂化。我发现完全爆炸的枚举就像一个类一样突兀,并且很难阅读。 ide a是我只是在父对象“PDF”和“HTML”中对两个字符串进行分组。一个枚举:
public enum SomeType {
PDF("application/pdf", "pdf"), HTML(...);
String contentType;
String fileEnding;
// Constructor ...
}
不允许您声明方法并指定此方法需要HTML内容。只有枚举类型是SomeType类型。存在“某人”将SomeType.PDF传递给该方法的风险。我在枚举和类中所做的事情看起来像是一个noob解决方案,而Java语言应该提供这样的功能,或者它已经提供了吗?
这有意义吗?
答案 0 :(得分:2)
你可以使用反射
System.out.println(myClass.getDeclaredField("property").get(null));
get
- 方法通常需要一个实例来获取属性,但由于property
是静态的,您可以将其传递给null
。
答案 1 :(得分:0)
我希望你这意味着 - 我用hamcrest写了测试 - 所以不要怀疑;)
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import org.junit.Test;
public class TestEnumEnding {
@Test
public void whenMethod1WithFiletypeHtmlWeShouldGetStringText_Html() throws Exception {
// Arrange
String contentType = null;
// Act
contentType = method1(Filetype.HTML);
// Assert
assertThat(contentType, is("text/html"));
}
@Test
public void whenMethod1WithFiletypePdfWeShouldGetapplication_pdf() throws Exception {
// Arrange
String contentType = null;
// Act
contentType = method1(Filetype.PDF);
// Assert
assertThat(contentType, is("application/pdf"));
}
private static String method1 (Filetype anyFiletype) {
return anyFiletype.getContentType();
}
public enum Filetype {
HTML("html","text/html"), PDF("pdf","application/pdf");
private final String fileEnding;
private final String contentType;
private Filetype(String fileEnding, String contentType) {
this.fileEnding = fileEnding;
this.contentType = contentType;
}
public String getFileEnding() {
return this.fileEnding;
}
public String getContentType() {
return this.contentType;
}
}
}
答案 2 :(得分:0)
public enum PDF { it;
static String contentType = "application/pdf";
static String fileEnding = "pdf";
}
static void myMethod1(PDF pdf) {
System.out.println(pdf.fileEnding);
}
public static void main(String[] args ) {
myMethod1(PDF.it); // Works fine! Somewhat verbose though because of the "it" keyword. Not 100% ideal!
}