Class <myclass> myClass </myclass>的静态类属性

时间:2011-11-02 15:27:30

标签: java

我在这里试验一下。

说我有课:

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语言应该提供这样的功能,或者它已经提供了吗?

这有意义吗?

3 个答案:

答案 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!      
}