繁体   English   中英

使用 java 中的反射从 class 绝对路径获取 class 属性

[英]Get class properties from class absolute path using reflection in java

我使用文件 package 生成新类,但是当我想使用反射获取 class 属性时,它不起作用,它给了我下面的错误但是当我刷新我的 ZEFE90A8E604A7C840E88D03A67F6B7我重新运行我的 function 它可以工作。 所以现在我认为我需要通过使用绝对路径而不是 package 的名称来更改我的方法来获取这些属性。

我的代码

import java.lang.reflect.Field;

public class Main7{
    public static void main(String[] args) throws Exception {

        Class classe = Class.forName("com.test.model.Client");
        // affiche tous les attributs
        System.out.println("Attributs -------------------------------------");
        for (Field attribut : classe.getDeclaredFields()) {
           // System.out.print("   "+Modifier.toString(attribut.getModifiers()));
            String type = attribut.getType().getName();
            if(type.contains(".")) {
                String[] tab = type.split("\\.");
                type=tab[2];
            }
            System.out.println(type+" "+attribut.getName());
        }

    }
}

错误

Exception in thread "main" java.lang.ClassNotFoundException: ma.dxc.generator.model.Client
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at generatortest.Main7.main(Main7.java:16)

好结果

Attributs -------------------------------------
long id
String name
String city

获取 class 属性的最简单方法是这样的:

Class klass = com.test.model.Client.class;

或者简单地说:

Class klass = Client.class;

如果您已经导入了上面的 class。

或者,如果您有 object 的实例:

Class klass = obj.getClass();

Class.forName()用于将新类动态加载到系统中。 并且没有必要通过反射获得 class 属性。

拥有Class object 后,您可以获得更多信息,例如getDeclaredFields()等。

如果你想在当前类路径之外加载一些东西,你可以像这样使用URLClassLoader

URLClassLoader loader = new URLClassLoader(new URL[] { "file://path/to/jar/or/directory"});
Class klass = loader.loadClass("com.test.model.Client");

这篇文章也可能是相关的: 如何使用 URLClassLoader 加载 *.class 文件?

Class.forName()不会超出您的类路径。 它旨在动态加载已添加到类路径中的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM