java基础之反射和泛型以及注解

网友投稿 253 2023-05-02


java基础之反射和泛型以及注解

java基础之反射和泛型以及注解

泛型擦除

泛型擦除: 泛型只在编译时期有效,编译后的字节码文件中不存在泛型信息。

声明泛型集合,集合两端类型必须一致。类型也可以用包装类型,泛型的类型必须是引用类型,不能为基本类型。

实现公用的类和方法,对公用的业务进行抽取。

泛型方法/泛型类/泛型接口

public class GenericTest

{

/**

* 泛型声明,定义泛型方法

* @param

* @param http://

* @param t

* @param k

*/

public K save(T t, K k)

{

return null;

}

@Test

public void testMethod() throws Exception

{

//使用泛型方法: 在使用泛型方法的时候,确定泛型的类型

save("hello", 1);

}

}

泛型类:

public class GenericTest

@Test

public void testMethod() throws Exception

{

//使用泛型方法: 在使用泛型方法的时候,确定泛型的类型

//save("hello", 1);

//泛型类如何使用:在创建泛型类的时候确定

GenericTest demo = new GenericTest();

demo.save("hello", 1);

}

泛型中的extends 和super的意义:

Extends:定义List Extends String>;传入的参数?必须是String类型的子类,否则会报错;

Super:定义List Super String>;传入的参数必须是String类型的父类,否则会报错;

Type : 接口,任何类型默认的接口!

反射

反射可以在运行时期动态创建对象,获取对象的属性,方法

/**

* @ClassName: App

* @Description: 反射技术

* @author lqw

* @date 2016-5-13 下午01:33:55

*

*/

public class App

{

@Test

public void testInfo() throws Exception

{

//类全名

String sql = "com.hbmy.reflect.demo2.Admin";

//得到类的字节码

Class> clazz = Class.forName(sql);

/**

* 创建对象1: 通过默认构造函数创建(简写)

*/

Admin admin = (Admin) clazz.newInstance();

/**

* 创建对象2: 通过无参构造器创建对象

*/

Constructor> constructors = clazz.getDeclaredConshttp://tructor();

constructors.newInstance();

/**

* 创建对象3:通过有参构造器创建对象

*/

Constructor> constructor = clazz.getDeclaredConstructor(String.class);

Admin admin2 = (Admin) constructor.newInstance("zhangsan");

// System.out.println(admin);

}

/**

* 获取属性名称、值

* getDeclaredFields: 获取所有的包含私有的属性名称

* getFields:只能访问public的属性

*/

@Test

public void testNameAndValue() throws Exception

{

//类全名

String sql = "com.hbmy.reflect.demo2.Admin";

//得到类的字节码

Class> clazz = Class.forName(sql);

Admin admin = (Admin) clazz.newInstance();

// Method[] methods = clazz.getMethods();

// for (Method method : methods)

// {

// //设置强制访问

// method.setAccessible(true);

// //名称

// String name = method.getNamhttp://e();

// System.out.println(name);

//

// }

// Field[] fields = clazz.getFields();//打印出来的结果只有money

Field[] fields = clazz.getDeclaredFields();

for (Field field : fields)

{

//设置强制访问

field.setAccessible(true);

//名称

String name = field.getName();

Object value = field.get(admin);

System.out.println(name + value);

}

}

/**

* 反射获取方法

*/

@Test

public void testGetMethods() throws Exception

{

//类全名

String sql = "com.hbmy.reflect.demo2.Admin";

//得到类的字节码

Class> clazz = Class.forName(sql);

Admin admin = (Admin) clazz.newInstance();

/*

* 获取方法对象

*/

Method declaredMethod = clazz.getDeclaredMethod("getId");

/**

* 调用方法

*/

Object return_value = declaredMethod.invoke(admin);

System.out.println(return_value);

Method[] methods = clazz.getDeclaredMethods();

for (Method method : methods)

{

method.setAccessible(true);

String name = method.getName(); qiaWE

System.out.println(name);

}

}

注解

注解的作用

1、 告诉编译器如何去运行

2、 简化(取代)配置文件

public class App

{

@Override

public String toString()

{

return super.toString();

}

@SuppressWarnings({"unused","unchecked"})

public void save()

{

List list = null;

}

@Deprecated

public void save1()

{

}

}

自定义注解: 通过自定义注解可以给类,字段,方法加上描述信息。

public @interface Author

{

/**

* 注解属性

* 1.修饰符为默认或者public

* 2.不能有主体

* 3. 如果注解名称为value,使用的时候可以省略名称,直接给值

*/

String name() default "lqw";

//带默认值得注解

int age() default 23;

String remark();

}

元注解

元注解就是注解的注解

指定注解的可用范围

@Target({

TYPE,

FIELD,

METHOD,

PARAMETER,

CONSTRUCTOR,

LOCAL_VARIABLE})

注解的生命周期

/**

* 元注解2: 指定注解的生命周期

* RetentionPolicy.SOURCE 只在源码级别有效

* RetentionPolicy.CLASS 只在类的字节码级别有效 默认值

* RetentionPolicy.RUNTIME 只在运行时期有效

*/

@Retention(RetentionPolicy.SOURCE)

最后总结一句:注解和反射其实不难,只要不畏惧,注解其实看看源码也就那么回事。至于反射嘛。可以这么说,无反射,则无框架,几乎所有的框架都是通过反射实现的。说白了,反射也就是通过加载类的字节码去获取类里面的方法和属性,其实框架也是这么实现的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mock框架工具(mock 框架)
下一篇:详解微信小程序Radio选中样式切换
相关文章

 发表评论

暂时没有评论,来抢沙发吧~