本文共 2446 字,大约阅读时间需要 8 分钟。
(使用频率高)
泛型类型是通过类型参数化的泛型类或接口。通过类型参数化,来解决程序的通用性设计和实现的若干问题。
泛型试图解决的问题:
泛型本身就是对于继承在使用上的一种增强。编译器在编译源码时,首先进行泛型类型参数的检查,然后进行类型 擦除并同时在类型参数出现的位置插入强制类型转换指令从而实现。
例如:可以获取类的构造器信息和对应的参数个数、可以获取类的属性信息、可以获取类的方法信息。
public class Apple(){ public Apple(){ } public Apple(String name){ this.name = name; } public String getName(){ return name; } public void setName(String name){ this.name = name; }}Class clazz = Apple.class;final Constructor[] constructors = clazz.getConstructors();//获取Apple类的构造器信息和对应的参数个数for(Constructor constructor : constructors){ System.out.println("construtor name:" + construtor.getName() + ", params length:" + constructor.getParameters().length);}//获取Apple类的属性信息final Field[] fields = clazz.getDeclaredFields();for(Field field : fields){ System.out.println("field name:" + field.getName());}//获取Apple类的方法信息final Method[] declaredMethods = clazz.getDeclaredMethods();for(Method method : declaredMethods){ System.out.println("method name:" + method.getName());}
class appleClazz = Class.forName("Apple");final Constructor constructor = appleClazz.getConstructor(String.class);final Object appleInstance = constructor.newInstance("China Apple");
非反射方式Java类的运行步骤:Apple.java -> 编译器 -> Apple.class -> JVM -> 运行
反射方式: 未知类型 -> 编译器 -> 运行
优势:
- 在一些场景中,“未知类型”实际上大大增加了程序运行时的灵活性,但是性能稍有损耗 - 对于对象的类型可以在运行时判断,这样的特性实际上是对多态极大的增强,进一步将上层的抽象与下层的具体实现解耦JBDC Driver:
final String DBUSER = "root";final String DBPASS = "";final String DBURL = "jbdc:mysql://localhost:3006/test";String DBDRIVER = "com.mysql.jdbc.Driver";Connection con = null;Class.forName(DBDRIVER);con = DriverManager.getConnection(DBURL, DBUSER, DBPASS);System.out.println(con);con.close();
注解是一种元数据,本身其实没有任何作用,如果要有,必须要依附在具体的对象上。
例:@Override
注解——问题抽象:应用范围、生命周期、可读性、注解继承
定义一个苹果描述注解:
@Target({METHOD, TYPE})@Rentention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface AppleDescription{ //定义了一个String的注解属性 String value();}
匿名函数、函数式编程思想。
转载地址:http://enoji.baihongyu.com/