写在最后
还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
for(int i=0; i<arrayList.size();i++){
String item = (String)arrayList.get(i);
System.out.println("test === ", item);
}
这段程序不能正常运行,原因是Integer类型不能直接强制转换为String类型
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
如果我们用泛型进行改写后,示例代码如下
List<String arrayList = new ArrayList();
arrayList.add(100);
这段代码在编译期间就会报错,编译器会在编译阶段就能够帮我们发现类似这样的问题。
[]( )泛型的使用
----------------------------------------------------------------------
泛型的使用有多种方式,下面我们就来一起探讨一下。
### []( )用泛型表示类
泛型可以加到类上面,来表示这个类的类型
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
public class GenericDemo{
//value这个成员变量的类型为T,T的类型由外部指定
private T value;
public GenericDemo(T value) {
this. value = value;
}
public T getValue(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
return value;
}
public void setValue(T value){
this.value = value;
}
}
### []( )用泛型表示接口
泛型接口与泛型类的定义及使用基本相同。
//定义一个泛型接口
public interface Generator {
public T next();
}
一般泛型接口常用于 **生成器(generator)** 中,生成器相当于对象工厂,是一种专门用来创建对象的类。
### []( )泛型方法
可以使用泛型来表示方法
public class GenericMethods {
public <T> void f(T x){
System.out.println(x.getClass().getName());
}
}
### []( )泛型通配符
List是泛型类,为了表示各种泛型List 的父类,可以使用类型通配符,类型通配符使用 **问号(?)** 表示,它的元素类型可以匹配任何类型。例如
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("cxuan");
age.add(18);
number.add(314);
generic(name) ;
generic(age);
generic(number);
}
public static void generic(List<?> data) {
System. out.println( "Test cxuan :" + data.get(0));
}
**上界通配符:** <? extends ClassType>该通配符为ClassType 的所有子类型。它表示的是任何类型都是ClassType 类型的子类。
**下界通配符:** <? super ClassType>该通配符为ClassType的所有超类型。它表示的是任何类型的父类都是ClassType。
[]( )反射
===================================================================
* * *
反射是Java 中一个非常重要同时也是一个高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。我们首先来认识一下什么反射。
**Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。**(来源于百度百科)
Java反射机制主要提供了以下这几个功能
* 在运行时判断任意一个对象所属的类
* 在运行时构造任意一个类的对象
* 在运行时判断任意一个类所有的成员变量和方法
* 在运行时调用任意一个对象的方法
这么一看,反射就像是一个掌控全局的角色,不管你程序怎么运行,我都能够知道你这个类有哪些属性和方法,你这个对象是由谁调用的,嗯,很屌。
在Java中,使用 **Java.lang.reflect** 包实现了反射机制。Java.lang.reflect所设计的类如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/985b85745796492f91005554a84dacd0.png#pic_center)
下面是一个简单的反射类
public class Person {
public String name;//姓名
public int age;//年龄
public Person() {
super();
}
public Person( String name,int age) {
super();
this.name = name;
this.age = age;
}
public string showInfo() {
return "name=" +name + ", age=”+age;
}
}
public class Student extends Person implements Study {
public string className;//班级
private string address;//住址
public student(){
super();
}
public student(String name,int age,String className,String address) {
super(name,age);
this.className = className;
this.address = address;
}
public student(String className) {
this.className = className;
}
public string toString() {
return"姓名: " + name + ",年龄;" + age +",班级: "+ className + ",住址:" +address;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class TestRelect {
public static void main(String[]args) {
Class student = null;
try {
student -=Class.forName( " com. cxuan.reflection.Student");
}catch (classNotFoundException e) {
e.printstackTrace();
}
//获取对象的所有公有属性
Field[] fields = student.getFields();
for (Field f : fields) {
System. out.println(f);
}
System. out.println( "------------")
//获取对象所有属性,但不包含继承的。
Field[] declaredFields = student.getDeclaredFields();
for (Field df : declaredFields) {
System. out.println(df );
}
//获取对象的所有公共方法
Method[]methods = student.getMethods();
for (Method m : methods) {
System.out.println(m);
}
System. out.println( "---------------------");
//获取对象所有方法,但不包含继承的
Method[] declaredMethods = student.getDeclaredMethods();
for (Method dm : declaredMethods) {
System.out.println(dm);
}
//获取对象所有的公共构造方法
Constructor[] constructors = student. getConstructors();
for (constructor c : constructors) {
System. out.println(c);
}
System. out.println( "---------------------");
//获取对象所有的构造方法
Constructor[] declaredConstructors = student.getDeclaredConstructors();
for (constructor dc : declaredConstructors) {
System. out.println(dc);
}
Class c = class.forName( "com. cxuan.reflection. Student");
Student stu1 = (Student) c.newInstance();
//第一种方法,实例化默认构造方法,调用set赋值
stu1.setAddress("河北石家庄");
System. out.println(stu1);
//第二种方法取得全部的构造函数使用构造函数赋值
Constructor<Student> constructor = c.getConstructor(String.class,int.class,String.class,string.class);
Student student2 = (Student) constructor .newInstance( " cxuan",24,"六班","石家庄");
System. out.println(student2);
/**
*玃取方法并执行方法
*/
Method show = c.getMethod("showInfo");//获取showInfo()方法
object object = show.invoke(stu2);//调用showInfo()方法
}
}
有一些是比较常用的,有一些是我至今都没见过怎么用的,下面进行一个归类。
与Java反射有关的类主要有
[]( )Class类
-----------------------------------------------------------------------
在Java 中,你每定义一个java class实体都会产生一个 Class对象。也就是说,当我们编写一个类,编译完成后,在生成的\*\*.class\*\*文件中,就会产生一个Class对象,这个Class对象用于表示这个类的类型信息。Class 中没有公共的构造器,也就是说Class对象不能被实例化。下面来简单看一下Class类都包括了哪些方法
**toString()**
public string toString(){
return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))+getName();
}
toString() 方法能够将对象转换为字符串,toString() 首先会判断Class类型是否是接口类型,也就是说,普通类和接口都能够用Class对象来表示,然后再判断是否是基本数据类型,这里判断的都是基本数据类型和包装类,还有**void** 类型。
所有的类型如下
* java.lang.Boolean :代表boolean数据类型的包装类
* java.lang.Character:代表char数据类型的包装类
* java.lang.Byte:代表 byte数据类型的包装类
* java.lang.Short:代表short 数据类型的包装类
* java.lang.Integer:代表int数据类型的包装类
* java.lang.Long:代表long 数据类型的包装类
* java.lang.Float:代表float 数据类型的包装类
* java.lang.Double:代表double 数据类型的包装类
* java.lang.Void:代表void数据类型的包装类
然后是 **getName()** 方法,这个方法返回类的全限定名称。
* 如果是引用类型,比如String.class.getName() -> java.lang.String
* 如果是基本数据类型,byte.class.getName() -> byte
* 如果是数组类型,new Object\[3\]).getClass().getName() -> \[Ljava.lang.0bject
**toGenericString()**
# 最后
各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了
![](https://img-blog.csdnimg.cn/img_convert/4d9c92cf15858c51658d8a195db96a92.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/df680e916bd99c7e14447ea533031092.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/2039c92d3455fb0a21f6342c94a7182e.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/36bc3ab8fd76786573216e34fc673368.webp?x-oss-process=image/format,png)
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**
**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
ava.lang.String
* 如果是基本数据类型,byte.class.getName() -> byte
* 如果是数组类型,new Object\[3\]).getClass().getName() -> \[Ljava.lang.0bject
**toGenericString()**
# 最后
各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了
[外链图片转存中...(img-fKgP1f2P-1715570409240)]
[外链图片转存中...(img-y6SHtqzD-1715570409241)]
[外链图片转存中...(img-8o3bGAG6-1715570409241)]
[外链图片转存中...(img-TzL7ESgN-1715570409242)]
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**
**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**