我们如何使用Class.forName来获取原始字节类?

时间:2014-01-29 05:33:00

标签: java reflection

我们可以使用Class.forName("[B")来获取字节数组,但是我们为原始字节类添加了什么:

例如

  Class.forName("??") => java.lang.Byte.TYPE

我尝试了"java.lang.Byte.TYPE""byte""B",但它们不起作用

4 个答案:

答案 0 :(得分:3)

通常,Class实例由ClassLoader创建。因此,对于来自不同Class实例的同一个类,您可以拥有2个ClassLoader个实例。

原始类型不是这样。每个JVM的每个基本类型只有一个Class实例。它是从native类中的Class方法创建并返回的。

static native Class getPrimitiveClass(String name);

这是直接分配给Byte.TYPE

public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");

或在您执行时返回

byte.class

您无法使用Class.forName(..)来获取它。

答案 1 :(得分:2)

这是不可能的。 The doc似乎确实可能会出现这种情况,并说:

  

使用给定的字符串名称返回与类或接口关联的类对象

由于基元没有类(只有类对象来表示它们以用于反射),因此不能以这种方式检索它们。

如果有想要这样的用途(IE不仅仅是出于好奇心的想法),下面的助手类包括它们:

import java.util.Map;
import java.util.HashMap;
import java.util.Collections;

public final class ForName {
    private ForName() {}

    private static final Map<String, Class<?>> PRIM = (
        Collections.unmodifiableMap(
            new HashMap<String, Class<?>>(16) {
                {
                    for(Class<?> cls : new Class<?>[] {
                        void.class,
                        boolean.class,
                        char.class,
                        byte.class,
                        short.class,
                        int.class,
                        long.class,
                        float.class,
                        double.class
                    }) {
                        put(cls.getName(), cls);
                    }
                }
            }
        )
    );

    public static Class<?> forName(final String name)
    throws ClassNotFoundException {
        final Class<?> prim = PRIM.get(name);

        if(prim != null)
            return prim;

        return Class.forName(name);
    }
}

答案 2 :(得分:0)

对于基本类型和void,无法从forName获得Class对象。您必须使用类文字, int.class 或相应包装类的TYPE字段,例如 Void.TYPE

如果坚持使用forName,则可以首先获取对应数组类型的Class对象,然后使用getComponentType获取原始类型本身。例如:

  Class<?> c = Class.forName("[B");
  Class<?> primitive = c.getComponentType();

答案 3 :(得分:-1)

你有没有尝试过:

Class<?> t = Class.forName("java.lang.Byte");

我没有对此进行过测试,另外您还没有显示任何示例代码,而您正在尝试做什么....