`

Class<T>相比Class的灵活运用

阅读更多

 

package basedao.test;

import java.lang.reflect.ParameterizedType;

//import java.lang.reflect.Type;

public abstract class SuperClass<T> {

	private Class<T> clazz;

	@SuppressWarnings("unchecked")
	public SuperClass() {
		clazz = (Class<T>) ((ParameterizedType) super.getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public Class<T> getClazz() {
		return clazz;
	}

	public void setClazz(Class<T> clazz) {
		this.clazz = clazz;
	}

	/**
	 * 普通的非泛型类Class
	 * 泛型化的类Class<T>
	 * JDK中,普通的Class.newInstance()方法的定义返回Object,要将该返回类型强制转换为另一种类型;
	 * 但是使用泛型的Class<T>,Class.newInstance()方法具有一个特定的返回类型;
	 * @param args
	 */
	public static void main(String[] args) {
		SuperClass<Person> superClass = new SubClass();
		//1.得到泛型类T实际的完整类名
		System.out.println(superClass.getClazz());
		//2.得到泛型类T的对象
		try {
			System.out.println(superClass.getClazz().newInstance());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		//3.调用泛型类T的方法
		try {
			superClass.getClazz().newInstance().function();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

class SubClass extends SuperClass<Person> {

	public SubClass() {
		super();
	}

}

class Person {
	public Person() {
		super();
	}

	public void function() {
		System.out.println("function in Person.class...");
	}
}

输出结果:
class basedao.test.Person
basedao.test.Person@10d448
function in Person.class...

 

 

0
9
分享到:
评论

相关推荐

    log4j2在SpringMVC工程中的运用

    &lt;PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/&gt; &lt;/Console&gt; &lt;/Appenders&gt; &lt;Loggers&gt; &lt;Root level="info"&gt; &lt;AppenderRef ref="Console"/&gt; &lt;/Root&gt; &lt;/Loggers&gt; &lt;/...

    C#泛型学习和理解代码示例

    泛型集合(如`List&lt;T&gt;`)与非泛型集合(如`ArrayList`)相比,提供了更好的类型检查和性能。泛型集合避免了非泛型集合中的类型转换开销。 综上所述,C#泛型是一个强大的工具,它提高了代码的灵活性、复用性和效率...

    python学习笔记day3 之元组类型和字典类型(csdn)————程序.pdf

    print(vart, type(vart)) # 输出:1 &lt;class 'int'&gt; vart = (1,) print(vart, type(vart)) # 输出:(1,) &lt;class 'tuple'&gt; ``` 此外,元组的定义并不总是需要括号。下面的定义方式也是有效的: ```python vart = 1,...

    基于C#控制台的集合与泛型示例程序

    相比之下,泛型集合如List&lt;T&gt;提供了更强的类型安全性,T代表了集合中元素的类型。 **泛型**是C#中一个强大的特性,它允许我们在定义类、接口、方法和委托时引入类型参数,以实现更灵活和高效的代码。泛型集合如List...

    C# List 排序各种用法与比较

    不过,当需要更复杂的排序逻辑或者需要复用比较逻辑时,`IComparer&lt;T&gt;`提供了更大的灵活性。选择哪种方法取决于具体项目的需求和开发者的个人喜好。希望这篇文章能帮助到你理解和运用这些排序方法。感谢对本文的支持...

    c++数据结构及算法模板

    在C++编程中,数据结构和算法是两个非常重要的概念,它们构成了软件开发的基础。数据结构是用来组织和存储数据的方式,而算法则是解决问题的具体...理解并能灵活运用这些知识,将使你在解决实际问题时更加得心应手。

    C#3.0一些新语法

    集合初始化器特别适用于 `System.Collections.Generic.ICollection&lt;T&gt;` 及其子类型,例如 `List&lt;T&gt;` 或 `Dictionary&lt;TKey, TValue&gt;`。下面是一个使用集合初始化器创建并初始化 `List&lt;string&gt;` 的例子: ```csharp ...

    Python 中开发pattern的string模板(template) 实例详解

    与更强大的`str.format()`方法或`f-string`相比,`string.Template`允许用户自定义变量的标识方式,这使得它在某些场景下更为灵活。 #### `string.Template`类的基本用法 `string.Template`类的核心功能是通过识别...

    Log4j2 demo

    &lt;PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/&gt; &lt;/Console&gt; &lt;File name="File" fileName="logs/app.log"&gt; &lt;PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5...

    c#非常好用的類。值得一看

    C#的泛型列表(List&lt;T&gt;)、队列(Queue&lt;T&gt;)和字典(Dictionary&lt;TKey, TValue&gt;)等都是泛型容器的典型示例。 10. 异常处理: C#中的异常处理机制使用try-catch-finally语句块。当程序抛出异常时,相应的catch块可以...

    给大家一个C#四个小技巧

    这里使用了`Lazy&lt;T&gt;`类来实现延迟加载的功能,确保属性只在首次访问时执行初始化操作。 #### 技巧三:使用Producer/Consumer模式与委托 Producer/Consumer模式是一种常见的编程模式,它通常涉及到生产者和消费者两...

    第3讲 C#进阶编程

    为了解决这个问题,C#引入了System.Collections泛型容器,如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等,它们不仅提供了强类型安全,还支持动态调整大小,提高了性能和代码可读性。 文件操作是任何应用程序中的常见任务...

    Java反射机制.工作原理

    3. 构造器(Constructor):`Constructor` 类代表类的构造方法,`Constructor&lt;T&gt;.getDeclaredConstructors()` 可以获取类的所有构造器,然后根据需求进行实例化。 4. 方法(Method):`Method` 类代表类的方法,...

    ArrayStack_TPD

    this.stack = new ArrayList&lt;&gt;(); } public void push(T item) { stack.add(item); } public T pop() { if (stack.isEmpty()) { throw new EmptyStackException(); } return stack.remove(stack.size...

    深入浅出JNA—快速调用原生函数1.0

    std::wcout &lt;&lt; L"名字:" &lt;&lt; person-&gt;name &lt;&lt; L" 年龄:" &lt;&lt; person-&gt;age &lt;&lt; std::endl; } ``` 要使用JNA调用此函数,我们需要定义一个对应的Java结构体: ```java public class Person extends Structure { ...

    java的API文档

    例如,`ArrayList&lt;T&gt;`中的`T`就是一个类型参数,可以在使用时指定具体的类型。 8. **枚举**:`enum`关键字定义了枚举类型,它是一种特殊的类,常用于表示固定数量的值,如星期、状态等。 9. **并发工具类**:`java...

    用队列实现杨辉三角的C++源程序

    template &lt;class T&gt; class SeqQueue { public: SeqQueue() { maxSize = 50; element = new T[maxSize]; front = 0; rear = 0; } ~SeqQueue() { delete[] element; } bool EnQueue(const T& x); bool DeQueue(T& ...

    CPP-Summit 2019 - 吴咏炜 - 深入浅出 C++20 协程.pdf

    for (auto i : fibonacci() | ranges::views::take_while([](uint64_t x) { return x &lt; 10000; })) { cout &lt;&lt; i &lt;&lt; endl; } for (auto i : fibonacci() | ranges::views::take(20)) { cout &lt;&lt; i &lt;&lt; endl; } ``` ...

    TypeScriptTut:滑梯

    function identity&lt;T&gt;(arg: T): T { return arg; } ``` #### 模块 ```typescript export class Calculator { add(a: number, b: number) { return a + b; } } // 导入模块 import { Calculator } from './...

    二十三种设计模式【PDF版】

    o m m u n i c a t i n go b j e c t)的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复用性更 好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个...

Global site tag (gtag.js) - Google Analytics