Java基础-反射应用

反射基本应用

反射进行对象实例化

在JDK1.8及以前的实例化:

1
2
@Deprecated(since="9")
public T newInstance() throws InstantiationException, IllegalAccessException

在JDK1.9+的实例化:

1
clazz.getDeclaredConstructor().newInstance()

java面试题汇总

本人最近也是一直在复习整合之前接触过的技术点,进行查漏补缺,这是本人最近参与培训讲座的时候,由大神给出的一些大厂的面试问题清单,本人将其分享出来,另外的话,本人也是在对应的Java面试题汇总这篇文章中对相关的问题作出陆续的回答,另外比较大一些的技术点,本人会专门出相关的博文进行梳理讲解,方便大家可以学习查阅。

java面试题汇总

Java基础篇

一、请解释Object类中的所有的方法以及每一个方法使用的注意事项。

  1. 对象克隆方法:

    1
    protected native Object clone() throws CloneNotSupportedException;

    克隆对象所在的类一定要实现java.lang.Cloneable接口,而且子类只需要调用父类的clone方法即可实现克隆操作。

  2. 对象输出方法:

    1
    2
    3
    public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    直接输出对象的时候会默认调用该方法

java基础-动态代理

java基础-反射基础

反射的研究目的

Java反射是框架设计的灵魂,如果自己想要改造或者设计一些框架或者更好地能够读懂源码,那么就必须得好好研究一下反射。

反射基础

定义

在运行状态中,对任意一个类,能够知其所有的方法和属性;对于任意一个对象,能够调用它的任意方法和属性。这种动态获取信息以及动态调用方法的功能就叫做Java反射机制。

java基础-泛型

为什么要深入一下泛型?

本人最近开始在深读一些源码,发现有些底层的一下设计理解的不是很透彻,很多优秀的框架用到了各种各样的设计模式外加一些泛型去实现,不审核将泛型进行理解,感觉总是一头雾水。

定义

聊到泛型,我们第一个想到的就是,这个东西到底是干什么的,我想很大一部分小伙伴应该也是仅仅停留在偶尔使用这个水平上面,至于再深入一些,估计能说出来的够呛。书上这么说,泛型,即“参数化类型”。说到参数,我们知道,定义方法的时候是形参,传递实参。那何为参数化类型?对比着上面的理解,其实也很容易,说白了就是将原来的类型进行参数化。操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

特性

泛型只在编译阶段有效。我们看下如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @Author: maoba
* @Description:
* @Date: 2020-05-27 22:48
*/
public class GenericsDemo {
public static void main(String[] args) {
List stringArrayList = new ArrayList();
List integerArrayList = new ArrayList();
Class classStringArrayList = stringArrayList.getClass();
Class classIntegerArrayList = integerArrayList.getClass();
if(classStringArrayList.equals(classIntegerArrayList)){
System.out.println("泛型测试类型相同");
}
}
}

最终我们输出的结果是“泛型测试类型相同”(大家可以直接拷贝本人的代码去运行一下)。这个结果说明了什么呢?说明在编译之后程序会采取去泛型化的措施。明明是不同的类型,但是class字节码却是同一份。也就是说明在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。简而言之,泛型信息不会进入到运行时阶段。

使用

开头的时候我们提到了,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。那么我们就分别来看一下这三种场景下泛型的使用。

泛型类

上述例子提到的List,说白了就是一个泛型类。我们还是自己写一个,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* @Author: mao ba
* @Description: 泛型类例子
* @Date: 2020-05-27 22:58
* 说明:以下代码,其中"T"的类型都是由外部传入所定
*/
public class GenericsClassDemo<T> {

//内部定义一个T的属性
private T t;

//new出对象的时候传入该参数
GenericsClassDemo(T t){
this.t = t;
}
//再设置一个无参构造器
GenericsClassDemo(){
}
//同样地我们给T这个属性设置GET、SET方法、给 T传递值的时候有两种方式,
//1、通过构造器传递 2、通过set
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}

调用函数:

1
2
3
4
5
6
7
8
9
10
11
public class GenericsTestMain {
public static void main(String[] args) {
/**说明,以下传入参数,并不是只是规定的String,Integer,Long等等,自定义的类型亦可**/
GenericsClassDemo stringGenericsClassDemo = new GenericsClassDemo("测试");
System.out.println(stringGenericsClassDemo.getT());

GenericsClassDemo integerGenericsClassDemo = new GenericsClassDemo();
integerGenericsClassDemo.setT(123);
System.out.println(integerGenericsClassDemo.getT());
}
}

输出结果,分别为:“测试”、“123”。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×