阅读本文大概需要9分钟
以下题目是从面试经历和常考面试题中选出有点儿意思的题目,参考答案如有错误,请联系小编指正,感谢!
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。
①在运行时判断任意一个对象所属的类 ②在运行时构造任意一个类的对象 ③在运行时判断任意一个类所具有的成员变量和方法(通过setAccessible()方法可访问或修改private成员) ④在运行时调用任意一个对象的方法
首先得获取class字节码对象,再通过class对象可获取类中的各种属性和方法等 3种获取class对象方法: 1.通过Object类的getClass方法
Class clazz = foo.getClass();
2.通过对象实例方法获取对象
Class clazz = foo.class;
3.通过Class.forName方式
Class clazz = Class.forName("xx.xx.foo");//完整的类名,包括所在包
例子:
public class User {
private String name;
private int age;
private void speak(String name){
System.out.println("我的名字是:"+name);
}
public User(String name,int age)) {
this.name = name;
this.age = age;
}
}
User user = new User("张三",25);
// 获取User类中的所有方法
Method[] methods = User.class.getDeclaredMethods();
// 获取User类中的所有属性
Field[] fields = User.class.getDeclaredFields();
//遍历User类的所有属性
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
System.out.println(fields[i].getName()+":"+fields[i].get(user));
}
结果:
name:张三
age:25
(反射基本上可以获取类中所有的信息,请自行谷歌)
优点: 1.能够运行时动态获取类的实例,大大提高了系统的灵活性和扩展性; 2.与java动态编译相结合,可以实现无比强大的功能。 缺点: 1.使用反射的性能较低; 2.使用反射来说相对不安全; 3.破坏了类的封装性,可以通过反射来获取这个类的属性和私有方法。
常量
,对象一旦创建,不可更改
StringBuilder和StringBuffer:字符串变量
,对象可更改prototype
改为多实例<bean id="hi" class="com.test.Hi" init-method="init" scope="prototype">
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
equals方法其实是交给开发者重写,在自定义类里,你想用它比较什么都可以,只要你重写它,所以我们并不能单纯的说它是用来比较什么的
读前须知: 栈:存放对象引用 堆:存放所有new出来的对象和数组
数组可以存放基本数据类型,可以存放引用类型。数组的引用存放于栈中,实际存放的对象在堆中。 可看以下代码及分析:
// 存放基本数据类型
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// 存放自定义类型User
User[] userArr =new User[3];
User user1 = new User("张三");
User user2 = new User("李四");
user[0] = user1;
user[1] = user1;
user[2] = user2;
运行步骤分析:
ps:这里所说的指向是引用变量指向对象,即引用变量保存了对象在堆内存中的存储地址
可看下图,更好的理解:
ps:数组所存放的基本数据类型可能存放于堆中,也可能存放于方法区的常量池中,此处仅以堆中的基本数据类型为例。
后台回复"谷歌访问助手",获取插件访问谷歌,沉入信息的海洋
end~thanks!