0 0

Java通过反射实例化泛型类的问题10

Java语言中,想通过反射实例化一个抽象类的子类,问题也可以简化点,可以建个类继承这个抽象类,然后实例化子类。

public abstract class MyClass<T> {
    MyClass() {
    }

}


在代码中可以这么写:
new MyClass<String>() {}


但是如果通过反射,怎么把String这个type传进去,或者通过反射获得constructor,怎么把泛型信息传进去:

下面这个是个错误的写法,只是说明要实现的内容:
new MyClass<Class.forName("String")>() {
}

问题补充:
chen_yongkai 写道
通过反射是做不到的,抽象类也不能实例化


谢谢你的回复,我说的是“实例化一个抽象类的子类”,或者“可以建个类继承这个抽象类,然后实例化子类”,没说过要实例化抽象类

问题补充:
Wind_ZhongGang 写道
@Test
    public void reflect() throws Exception {
        Class<String> clazz = (Class<String>) Class.forName("java.lang.String");
        Constructor<String> constructor = clazz.getConstructor(String.class);
        String str = constructor.newInstance("ZhongGang");
        System.out.println(str);
    }

楼主你的意思没有表达清楚,不知是不是我理解错误



Constructor<String> constructor = clazz.getConstructor(String.class);

不是要将String当做构造函数的参数传进去。想通过字符串传进去的是泛型对应的类型:
Constructor<String> 这里面的String怎么用字符串“java.lang.String”通过什么方式传进去

也就是说MyClass类中的“T”,怎么用反射通过字符串传进入,而不是直接指定。

问题补充:我再把问题具体一点:
在使用jackson从json转换成bean时,需要传递类信息。
ObjectMapper mapper = new ObjectMapper();
String jackson1 = "json格式的字符串,略";
List<ClassA> list = mapper.readValue(jackson1, new TypeReference<ArrayList<ClassA>>(){});
String jackson2 = "json格式的字符串,略";
ClassB b = mapper.readValue(jackson2, new TypeReference<ClassB>(){});

然后拿着list或者b通过反射调用下面的接口,调用时会传递方法名。

public void testMethod(List<ClassA> list);

public void testMethod2(ClassB b);


想动态地给TypeReference传递类型信息,这个类型可能是ArrayList<ClassA>,也可能是ClassB,不确定,通过配置文件传递进来。

package org.codehaus.jackson.type;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * This class is used to pass full generics type information, and
 * avoid problems with type erasure (that basically removes most
 * usable type references from runtime Class objects).
 * It is based on ideas from
 * <a href="http://gafter.blogspot.com/2006/12/super-type-tokens.html"
 * >http://gafter.blogspot.com/2006/12/super-type-tokens.html</a>,
 * Additional idea (from a suggestion made in comments of the article)
 * is to require bogus implementation of <code>Comparable</code>
 * (any such generic interface would do, as long as it forces a method
 * with generic type to be implemented).
 * to ensure that a Type argument is indeed given.
 *<p>
 * Usage is by sub-classing: here is one way to instantiate reference
 * to generic type <code>List&lt;Integer></code>:
 *<pre>
 *  TypeReference ref = new TypeReference&lt;List&lt;Integer>>() { };
 *</pre>
 * which can be passed to methods that accept TypeReference.
 */
public abstract class TypeReference<T>
    implements Comparable<TypeReference<T>>
{
    final Type _type;

    protected TypeReference()
    {
        Type superClass = getClass().getGenericSuperclass();
        if (superClass instanceof Class<?>) { // sanity check, should never happen
            throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information");
        }
        /* 22-Dec-2008, tatu: Not sure if this case is safe -- I suspect
         *   it is possible to make it fail?
         *   But let's deal with specifc
         *   case when we know an actual use case, and thereby suitable
         *   work arounds for valid case(s) and/or error to throw
         *   on invalid one(s).
         */
        _type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
    }

    public Type getType() { return _type; }

    /**
     * The only reason we define this method (and require implementation
     * of <code>Comparable</code>) is to prevent constructing a
     * reference without type information.
     */
    @Override
    public int compareTo(TypeReference<T> o) {
        // just need an implementation, not a good one... hence:
        return 0;
    }
}


现在已经基本有了思路,但是还有点问题:
1.建个子类继承TypeReference,通过构造函数把类型信息传进来,修改TypeReference中的私有属性_type
import java.lang.reflect.Field;
import org.codehaus.jackson.type.TypeReference;

public class TypeReference4Reflect<T> extends TypeReference<T> {
	TypeReference4Reflect(T t) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException {
		Class<?> cla = TypeReference.class ;
        Field field =  cla.getDeclaredField("_type");
        field.setAccessible(true);
        field.set(this, t);
	}
}


2.通过方法名找到对应的参数信息,把参数信息作为TypeReference4Reflect的构造函数
	public static void reflect(String jackson) throws JsonParseException, JsonMappingException, IllegalArgumentException, SecurityException, IOException, IllegalAccessException, NoSuchFieldException, InvocationTargetException {
		ObjectMapper mapper = new ObjectMapper();
		Method[] methods = TestXMLAndJson.class.getDeclaredMethods();
		for(Method m: methods ) {
			if(m.getName().equals("testReflect")) {
				 Type[] types = m.getGenericParameterTypes();
				 Object o = mapper.readValue(jackson, new TypeReference4Reflect(types[0]));
			     TestJson testJSON = new TestJson();
			     m.invoke(testJSON, o);
			}
		}
	}
	
	public void testReflect(List<ClassA> psrList) {
		for(Iterator<ClassA> iter = psrList.iterator(); iter.hasNext(); ) {
			System.out.println(iter.next().getName());
		}
	}


3.存在的问题
if(m.getName().equals("testReflect"))
这种方式的判断肯定是不可靠的,有重载的方法就不好使了。参数个数不一样的重载还好办,可以通过判断参数个数来解决。针对目前我们的应用来说勉强可以,但是不够通用。如果参数个数一样类型不一样就不好办了。这样还得判断json内容和参数属性的匹配,不知道有没有更好的方法。

问题补充:
bukebuhao 写道
还以为要实例化一个抽象类的,不过,楼主为何要这样做呢?转换成一个泛型类,然后利用泛型简繁重复代码,泛型适用的情况,只是为了更好的编译,减少类型转换的错误。为何不考虑一下设计模式,转换成命令模式,回调方法不是一样可以实现效果


水平有限,没看出和命令模式有什么关系,请再详细指点一下吧。

问题补充:
bukebuhao 写道
按照我目前的理解,可能有错,仅供参考,你只要把json转换出来的bean包装成一个命令,无论是list还是普通的bean都转换成一个通用的命令,然后写一个通用的执行方法,执行命令,获取执行结果,无论以后从json获取的东西怎么变,执行命令的方式获取执行结果都不会受影响,你也可参考 http://www.iteye.com/topic/1121817


谢谢,但是我觉得怎么写这个通用的命令本身就和我提的问题类似。
目前想到的解决方案是这样的,还请各位指正:

通过方法名和参数个数做第一层过滤,然后直接使用符合条件的第一个方法的参数转换json,如果没有抛异常,认为调用方法正确,如果抛异常了,就尝试用下一个方法的参数转换。
这样基本可以解决我提出的问题,但是对于参数个数相同,类型不同的重载方法,存在效率问题。但是如果这种类型的重载方法很少,也可以勉强接受。还好,我们的系统只有一个方法存在这样的问题,而且调用频率极低,有时间做个测试,看看效率差多少。

问题补充:
aronlulu 写道
引用
通过方法名和参数个数做第一层过滤,然后直接使用符合条件的第一个方法的参数转换json,如果没有抛异常,认为调用方法正确,如果抛异常了,就尝试用下一个方法的参数转换。
这样基本可以解决我提出的问题,但是对于参数个数相同,类型不同的重载方法,存在效率问题。但是如果这种类型的重载方法很少,也可以勉强接受。还好,我们的系统只有一个方法存在这样的问题,而且调用频率极低,有时间做个测试,看看效率差多少。

你还不如对你传进去的json做过滤呢,看这种json格式是需要转成list的还是string的还是map的。无非就是校验格式。看看嵌套几层。校验完成后就可以回调相应的方法。
反射遍历,通过反射获取的method又没有缓存,效率会很低,而且还把运行时异常作为逻辑来使用,不太合适。
写个枚举类,写个校验方法,输入的json字符串,然后输出对应的格式枚举类型,然后直接调用该枚举类型的转换方法。
以后要是新增转换类型,无非就是新加个枚举,这跟你新写个重载方法代码量差不多。


谢谢。这里面不只是String,Map等Java类型,还可能是类似于ClassA,ClassB的自定义类型,目前要用到的自定义类型已经有了几十个,不同类型之间还可能组合,形成多层泛型,这种情况使用枚举的方式是不是就不太合适了,效率可能也不高。

问题补充:
bukebuhao 写道
按照楼主的思路去考虑,感觉最好要有一个标记来映射json数据和调用具体的方法,这样就不用去一个个方法去尝试了。现在很多流行的对外开放平台,都是能直接映射方法的。


其实客户端是知道请求参数类型的,完全可以传过来,但是我们的系统是开放给第三方的,在webservice中包一层json,第三方可能是Java也可能是C#的或者别的语言,所以让C#的客户端传个Java参数的类型标记,总觉得说不通。

问题补充:
aronlulu 写道
为何一定要传个Java参数的类型标记,任何一个有意的标记,通过map自动映射过去不一样啦。例如现在spring3 mvc都是通过url和方法自动映射的

不管你怎么映射,最后都是成为一个class类型标记,不然是不可能知道转成什么的。
无论你走多少弯路,最后都是一条出路。
Map.put("ajson","com.bean.A")
然后再Class.forname("com.bean.A")
而且这个ajson还得付在json里面,不累么?
传json过来,到底要转成什么样是不知道的,是由编程的人说了算。
LZ现在想法是遍历所有类型,看那个反射能匹配上就用哪个?这样不但要写的代码都得写,而且还要走一圈反射。
有时候不要想着太自动化,如果能够很自动化,j2ee里面就不会动不动就那么多配置文件了。
也许你会说不是可以自定义注解么?
但是对于这么简单的需求来说,再写个注解
@FromJson("ajson")
class A(){}

无非就是用一大段解析注解代码来换取
Map.put("ajson","com.bean.A")
Class.forname("com.bean.A")
这两行代码罢了。
可读性还差,更是没必要。


目前的方法代码肯定是少了很多,配置基本没有,扩展性很强,效率确实有损失。所以下一步是做个测试,看看效率到底损失多少,值不值得。

2012年3月23日 10:05

19个答案 按时间排序 按投票排序

0 0

采纳的答案

为何一定要传个Java参数的类型标记,任何一个有意的标记,通过map自动映射过去不一样啦。例如现在spring3 mvc都是通过url和方法自动映射的

不管你怎么映射,最后都是成为一个class类型标记,不然是不可能知道转成什么的。
无论你走多少弯路,最后都是一条出路。
Map.put("ajson","com.bean.A")
然后再Class.forname("com.bean.A")
而且这个ajson还得付在json里面,不累么?
传json过来,到底要转成什么样是不知道的,是由编程的人说了算。
LZ现在想法是遍历所有类型,看那个反射能匹配上就用哪个?这样不但要写的代码都得写,而且还要走一圈反射。
有时候不要想着太自动化,如果能够很自动化,j2ee里面就不会动不动就那么多配置文件了。
也许你会说不是可以自定义注解么?
但是对于这么简单的需求来说,再写个注解
@FromJson("ajson")
class A(){}

无非就是用一大段解析注解代码来换取
Map.put("ajson","com.bean.A")
Class.forname("com.bean.A")
这两行代码罢了。
可读性还差,更是没必要。

2012年3月26日 20:02
0 0

readValue2List(String jsonStr, Class<T> tClass ) {
        try {
            TypeReference<List<T>> typeRef = new TypeReference<List<T>>() {
                @Override
                public Type getType(){
                    return new ParameterizedType() {
                        @Override
                        public Type[] getActualTypeArguments() {
                            return new Type[]{tClass};
                        }

                        @Override
                        public Type getRawType() {
                            return List.class;
                        }

                        @Override
                        public Type getOwnerType() {
                            return null;
                        }
                    };
                }

            };
            return mapper.readValue(jsonStr, typeRef);
        } catch (Exception e) {
            throw new RuntimeException("not able to convert json string:"
                    + jsonStr);
        }
    }

2017年8月02日 13:42
0 0

讨论到这种程度,已经很不错了,lz也已经有了可选的方案了。希望以后多多交流

2012年3月26日 21:34
0 0

引用
aronlulu 的方式是可取的,不过,lz的意思现在是如何关联json和具体的实现类
引用
其实客户端是知道请求参数类型的,完全可以传过来,但是我们的系统是开放给第三方的,在webservice中包一层json,第三方可能是Java也可能是C#的或者别的语言,所以让C#的客户端传个Java参数的类型标记,总觉得说不通。
为何一定要传个Java参数的类型标记,任何一个有意的标记,通过map自动映射过去不一样啦。例如现在spring3 mvc都是通过url和方法自动映射的

2012年3月26日 18:50
0 0

晕,测试后发现JsonUtils还要加配置项,
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
LZ莫怪。应该加一行,如下:

public final class JsonUtils
{
    private static ObjectMapper mapper = new ObjectMapper();

    static
    {
        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    }

    private JsonUtils()
    {
    }

    public static <T> Object toBean(String json, Class<T> type, Parser<T> parser)
            throws Exception
    {
        T obj = mapper.readValue(json, type);
        Object result = parser.testReflect(obj);
        return result;
    }

    static interface Parser<T>
    {
        Object testReflect(T obj);
    }
}

2012年3月26日 18:21
0 0

这个类型本身就是你们系统定义的,当然得自己写代码的时候传。
就一个普通的字符串:{'result':'201','bean':{'result':'201'}}
你不写类型程序肯定不知道转成哪个bean啊。至于这个类型来自文件,还是代码里写死,这个是可以做到的。现在的问题点是你反射一大圈最后还是自己写类型。因为java里面没有类似于C++的模板。
你要么传java类型,要么预留接口传脚本(如嵌入groovy,ruby)。
也就是说你不管怎么绕,类型永远要传。类型不一致造成的冗余代码永远要写。
下面的代码同样做了你反射做的事情:

public final class JsonUtils
{
    private static ObjectMapper mapper = new ObjectMapper();

    private JsonUtils()
    {
    }

    public static <T> Object toBean(String json, Class<T> type, Parser<T> parser)
            throws Exception
    {
        T obj = mapper.readValue(json, type);
        Object result = parser.testReflect(obj);
        return result;
    }

    static interface Parser<T>
    {
        Object testReflect(T obj);
    }
}

测试:
public class TestJsonUtil
{

    public static void main(String[] args) throws Exception
    {
        Object obj = JsonUtils.toBean(
                "{'result':'201','bean':{'result':'201'}}", Bean.class,
                new JsonUtils.Parser<Bean>()
                {

                    @Override
                    public Object testReflect(Bean obj)
                    {
                        return obj;
                    }
                });
        System.out.println(((Bean) obj).getBean().getResult());
    }

    public static class Bean
    {
        String result;

        Bean2 bean;

        public Bean2 getBean()
        {
            return bean;
        }

        public void setBean(Bean2 bean)
        {
            this.bean = bean;
        }

        public String getResult()
        {
            return result;
        }

        public void setResult(String result)
        {
            this.result = result;
        }
    }

    public static class Bean2
    {
        String result;

        public String getResult()
        {
            return result;
        }

        public void setResult(String result)
        {
            this.result = result;
        }
    }

}

2012年3月26日 18:18
0 0

按照楼主的思路去考虑,感觉最好要有一个标记来映射json数据和调用具体的方法,这样就不用去一个个方法去尝试了。现在很多流行的对外开放平台,都是能直接映射方法的。

2012年3月26日 14:28
0 0

引用
通过方法名和参数个数做第一层过滤,然后直接使用符合条件的第一个方法的参数转换json,如果没有抛异常,认为调用方法正确,如果抛异常了,就尝试用下一个方法的参数转换。
这样基本可以解决我提出的问题,但是对于参数个数相同,类型不同的重载方法,存在效率问题。但是如果这种类型的重载方法很少,也可以勉强接受。还好,我们的系统只有一个方法存在这样的问题,而且调用频率极低,有时间做个测试,看看效率差多少。

你还不如对你传进去的json做过滤呢,看这种json格式是需要转成list的还是string的还是map的。无非就是校验格式。看看嵌套几层。校验完成后就可以回调相应的方法。
反射遍历,通过反射获取的method又没有缓存,效率会很低,而且还把运行时异常作为逻辑来使用,不太合适。
写个枚举类,写个校验方法,输入的json字符串,然后输出对应的格式枚举类型,然后直接调用该枚举类型的转换方法。
以后要是新增转换类型,无非就是新加个枚举,这跟你新写个重载方法代码量差不多。

2012年3月26日 10:05
0 0

按照我目前的理解,可能有错,仅供参考,你只要把json转换出来的bean包装成一个命令,无论是list还是普通的bean都转换成一个通用的命令,然后写一个通用的执行方法,执行命令,获取执行结果,无论以后从json获取的东西怎么变,执行命令的方式获取执行结果都不会受影响,你也可参考 http://www.iteye.com/topic/1121817

2012年3月25日 18:45
0 0

引用
3.存在的问题
if(m.getName().equals("testReflect"))
这种方式的判断肯定是不可靠的,有重载的方法就不好使了。参数个数不一样的重载还好办,可以通过判断参数个数来解决。针对目前我们的应用来说勉强可以,但是不够通用。如果参数个数一样类型不一样就不好办了。这样还得判断json内容和参数属性的匹配,不知道有没有更好的方法。

LZ其实你绕了一大圈又回到了起点,你现在的“参数个数一样类型不一样就不好办了”这个问题不就是刚开始你提的么。
public void testMethod(List<ClassA> list);   
  
public void testMethod2(ClassB b); 

你想用一个
public void testMethod(T t);
搞定
问题在于java在运行时是不会知道T是什么的,T反射时是没办法动态化的,你只有通过写代码告诉编译器T是什么类型才行。
public void testReflect(List<ClassA> psrList)

就是你告诉编译器T是list类型,所以换成别的类型比如String,你就必须再写一个
public void testReflect(String string)

这就是为什么像命令模式了,你告诉他什么类型,然后就执行什么类型的方法。

2012年3月24日 23:44
0 0

还以为要实例化一个抽象类的,不过,楼主为何要这样做呢?转换成一个泛型类,然后利用泛型简繁重复代码,泛型适用的情况,只是为了更好的编译,减少类型转换的错误。为何不考虑一下设计模式,转换成命令模式,回调方法不是一样可以实现效果

2012年3月24日 19:43
0 0

好吧,楼主你就自己看吧,我也不说什么了,拿得到拿不到楼主看了就明白了 

你先看清楚吧,不要误导了LZ。
MyClass类中的“T”你能拿到?
说了 类型擦除,T永远是被擦除掉的,反射只能操作字节码,字节码中有的就能获取,T属于泛型,字节码中没有。
new MyClass<String>这个是泛化的么?文章中的方式就是获取这种非泛化类型,毫无意义,所以说不要把反射跟泛型扯在一起,只会让人误导java的泛型有多强大似的。
说了,只能用来做编译检查。

2012年3月23日 21:04
0 0

好吧,楼主你就自己看吧,我也不说什么了,拿得到拿不到楼主看了就明白了
http://www.iteye.com/topic/585900

2012年3月23日 20:51
0 0

反射实例化一个抽象类,应该是不可的,因为反射只是一种语法约束而已,可利用内部类实例化匿名类。例如 new MyClass<String> { //实现抽象方法}

2012年3月23日 19:45
0 0

引用
虽然对于java来说泛型再编译的时候被擦除了,但是始终还是能拿到它的信息的

都擦除了还怎么拿,你看清楚你拿到的是什么信息,E才是想要的,而不是强制转换的内部变量。都知道是Class类型了,当然拿得到。
去看看C++的模板类,就知道什么是真正的泛型了。

2012年3月23日 17:50
0 0

虽然对于java来说泛型再编译的时候被擦除了,但是始终还是能拿到它的信息的

public class A<E> extends B
   protected Class<E> entityClass;  
   
  public A() {  
     entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
}

2012年3月23日 17:29
0 0

做不到的。
java的泛型跟C++不一样。
java的泛型仅限于编译的时候类型检查。List<String>跟List经过编译后都是List,jvm是看不到泛型的。
所以反射这种基于字节码的动态特性是没办法跟泛型扯上关系的。

2012年3月23日 15:24
0 0

@Test
    public void reflect() throws Exception {
        Class<String> clazz = (Class<String>) Class.forName("java.lang.String");
        Constructor<String> constructor = clazz.getConstructor(String.class);
        String str = constructor.newInstance("ZhongGang");
        System.out.println(str);
    }

楼主你的意思没有表达清楚,不知是不是我理解错误

2012年3月23日 11:13
0 0

通过反射是做不到的,抽象类也不能实例化

2012年3月23日 11:05

相关推荐

    利用反射生成泛型类对象

    对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。

    Java让泛型实例化的方法

    然而,在 Java 中使用泛型时,会出现一个问题:如何实例化泛型对象?在 Java 中,泛型擦除机制使得编译器无法确定泛型所对应的真实类型,因此无法直接实例化泛型对象。下面将详细介绍 Java 让泛型实例化的方法。 ...

    利用java反射、注解及泛型模拟ORM实现

    通过`Class`类,我们可以实例化未知类型的对象,调用私有方法,访问私有字段,以及检查类的结构等。这对于创建通用代码,如ORM框架,或者在不修改源代码的情况下扩展功能非常有用。 2. 注解(Annotation):注解是...

    Java泛型_Java中的泛型结构_

    - 实例化泛型(Instantiation):在使用泛型时,为类型参数提供具体类型,如 `Box&lt;Integer&gt;` 或 `List&lt;String&gt;`。 2. 泛型类: - 定义:`class MyClass&lt;T&gt; { ... }`,这里的 `T` 是类型参数,可以在类的方法和...

    Java反射泛型,实现数据库的动态增删改查等功能

    Java反射和泛型是两种强大的编程特性,它们在开发中有着广泛的应用,特别是在数据库操作的动态化场景下。本文将详细介绍如何结合这两种技术实现在Java中对MySQL、SQL Server或Oracle数据库进行动态的增删改查操作。 ...

    Java泛型的用法及T.class的获取过程解析

    2. 泛型 + 反射:泛型可以与反射结合使用,通过反射的API来获取T的Class。 3. 收敛:泛型可以增加类型安全,减少了强制类型转换的代码。 4. MetaProgramming:泛型可以在编译期搞很多东西,比如MetaProgramming。 ...

    Java 理论和实践 了解泛型

    4. 实例化泛型类:创建泛型类的实例时,需要提供实际类型,如`Box&lt;Integer&gt; box = new Box();` 5. 泛型通配符:`?`代表任意类型,但通常有上下界限制,如`List&lt;?&gt; list`表示列表可能包含任意类型的元素,而`List...

    myreflect.rar 反射和泛型使用源码

    1. **类型参数**:定义泛型类或接口时,使用尖括号`&lt;T&gt;`表示类型参数,T是占位符,代表任意类型。 2. **通配符**:如`?`,表示未知类型,常用于方法参数,提供更大的灵活性。 3. **边界**:`&lt;T extends SomeClass&gt;`...

    实例讲解Java泛型编程的快速入门

    - 泛型类实例化:创建泛型类的实例时,需要指定类型参数的实际类型,如`TestGen, Integer&gt; t = new TestGen, Integer&gt;();` 2. **泛型通配符** - 无界通配符:`?`表示任何类型,但无法在方法内部进行添加操作,...

    Java1_5泛型.zip

    在实例化时,我们可以指定 `T` 的具体类型,如 `ArrayList&lt;String&gt;` 或 `ArrayList&lt;Integer&gt;`。 3. 泛型方法:除了在类中使用泛型,还可以在方法中使用。例如,`public &lt;T&gt; void printList(List&lt;T&gt; list) {...}` ...

    Java泛型实例

    - 泛型类:如 `List&lt;T&gt;`,`T` 是元素的类型,可以在实例化时指定为具体类型,如 `List&lt;String&gt;` 或 `List&lt;Integer&gt;`。 - 泛型方法:在方法声明中添加类型参数,如 `public &lt;T&gt; void print(T t)`,`T` 在方法作用域...

    反射处理java泛型_.docx

    在基类中定义一个构造函数,传入泛型类型`T`的`Class`对象,这样子类实例化时可以明确传入: ```java public abstract class Foo&lt;T&gt; { private Class&lt;T&gt; tClass; public Foo(Class&lt;T&gt; tClass) { this.tClass =...

    java 反射实例,大量注释,简单易懂

    2. **反射实例化对象**: - 使用`Constructor`的`newInstance()`方法可以动态创建类的对象,即使这个类没有公开的构造器。 3. **动态调用方法**: - `Method`类的`getMethods()`返回所有公共方法,`getMethod...

    泛型工具类

    - 接着,方法会检查获取到的类型是否为`ParameterizedType`类型,这是Java泛型体系中表示参数化类型的接口。如果不是,则同样返回`Object.class`。 - 如果类型检查通过,方法会继续提取实际的类型参数数组,并根据...

    Java反射、泛型和注解实战之Spring核心注入IOC的实现

    3. 实现注入逻辑:创建一个类或接口,如`Injector`,提供方法来根据收集到的信息实例化对象并注入依赖。可以使用反射来获取类的构造函数或字段,然后通过`Class.newInstance()`或`Field.set()`进行操作。 4. 配置...

    反射泛型

    如果类具有泛型参数,我们可以使用反射来获取实际的泛型类型,从而更好地理解实例化的对象。 2. **动态调用方法**:使用`Class.getMethod()`或`Class.getDeclaredMethod()`获取方法对象,然后调用`invoke()`方法...

    java5泛型新特性 pdf

    当我们实例化列表时,可以指定`E`的具体类型,如`List&lt;String&gt;`或`List&lt;Integer&gt;`。 2. **通配符**:泛型中使用通配符可以增加类型参数的灵活性。例如,`?`表示任何类型,`? extends Number`则限制为Number或其子类...

    实例185 - 自定义泛型化数组类

    总结起来,"实例185 - 自定义泛型化数组类"是关于如何利用Java泛型特性创建安全且灵活的数组容器的一个案例。通过理解泛型、数组的限制以及如何结合两者,我们可以编写出更强大、更安全的代码,提升代码的复用性和...

    java反射与泛型综合例子

    Java反射和泛型是Java编程中的两个重要特性,它们各自有着独特的作用,但在某些场景下也可以结合使用。本文将深入探讨这两个概念,并提供一个综合性的例子来帮助理解。 首先,让我们了解一下Java反射。反射是在运行...

    泛型 反射 相关概念方法使用

    例如,在某些情况下,我们可能需要动态地创建泛型类的实例,这时可以利用反射的Constructor.newInstance()方法。但是需要注意,由于类型擦除,泛型信息在运行时并不直接存在,因此在使用反射处理泛型时,必须格外...

Global site tag (gtag.js) - Google Analytics