java反射……未整理完
前两天大师傅给面试,仿佛接受洗礼一般。
学习java底层是很重要的,要把自己的知识点稳固一下。
感谢dkk师傅,送我的java安全学习连接。
在这也分享给大家:https://javasec.org/javase/Reflection/Reflection.html
java反射机制简介
Java反射(Reflection
)是Java非常重要的动态特性,
通过使用反射我们可以:
-
获取到任何类的成员方法(
Methods
)、成员变量(Fields
)、构造方法(Constructors
)等信息,此处强调所有权限修饰都可得到。 -
还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。
Java反射机制是Java语言的动态性的重要体现,也是Java的各种框架底层实现的灵魂。
参考:https://javasec.org/javase/Reflection/Reflection.html
学习时建立的一个简要的目录结构
可参考下图:
获取Class(类)对象的三种方法
先把Person.java写好
Person.java
package com.human;
public class Person {
public String a;
protected String b;
private String name;
private int age;
String c;
public Person(){
}
public Person(String name ,int age){
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat(){
System.out.println("eat……nothing");
}
public void eat(String food){
System.out.println("eat……"+food);
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name=\'" + name + \'\\\'\' +
", a=\'" + a + \'\\\'\' +
", b=\'" + b + \'\\\'\' +
", c=\'" + c + \'\\\'\' +
\'}\';
}
}
ReflectDemo1.java
package com.reflect;
import com.human.Person;
public class ReflectDemo1 {
public static void main(String[] args) throws Exception{
/*
1. class.forName获取类对象
*/
Class cls1 = Class.forName("com.human.Person");
System.out.println(cls1);
/*
2. 类名.class获取类对象
*/
Class cls2 = Person.class;
System.out.println(cls2);
/*
3. getClass方法获取类对象
*/
Person p = new Person();
Class cls3 = p.getClass();
System.out.println(cls3);
/*根据上述的三个输出,我们知道了三种的到类对象的函数*/
/*
根据等于号的传递性,我们现在可以明确:
class这个字节码文件,再一次程序中的只加载一次,
这也是为什么三个cls都相同的原因。
*/
System.out.println(cls1==cls2);
System.out.println(cls2==cls3);
}
}