反射

Reflect 反射:面試

全部類都是Object的子類安全

全部類的對象都是Class類的實例spa

 

反射:在程序運行期間,對於任意一個類,咱們都能知道這個類中全部的屬性和方法(包含私有的),這種動態的獲取類的信息和動態的調用對象的方法或者屬性的功能====>Java反射機制對象

可是破壞了封裝的安全性生命週期

爲何須要完整限定名:get

完整限定名=包名+類名it

在同一個包中不容許出現相同的類io

確保類是惟一的class

1.Class.forName("完整限定名").getName()引用

2.類名.Class.getName()

3.對象名.getClass.getName()

@Test
public void Test01(){
try {
System.out.println("第一種式:"+Class.forName("demo3.fanshe.Student").getName());
System.out.println("第二種方式:"+Student.class.getName());
System.out.println("第三種方式:"+new Student().getClass().getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

@Test
public void Test02(){
try {
Class c = Class.forName("demo3.fanshe.Student");
System.out.println("Student類所在的包:"+c.getPackage().getName());
System.out.println("Student類完整限定名:"+c.getName());
System.out.println("Student類簡寫的類名:"+c.getSimpleName());
int num = c.getModifiers();
String result = Modifier.toString(num);
System.out.println("獲取類的修飾符"+result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* getFields(): 只能獲取public修飾的字段
* getDeclaredFields():全部字段的集合
*/

@Test
public void Test03(){
try {
Class c = Class.forName("demo3.fanshe.Student");
Field[] fields = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
System.out.print(fields[i].getName());
System.out.println("對應的修飾符是:"+Modifier.toString(fields[i].getModifiers()));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* c.getMethods() :獲取全部public修飾的方法
* c.getDeclaredMethods():獲取全部的方法
*/

@Test
public void Test04(){
try {
Class c = Class.forName("demo3.fanshe.Student");
Method[] methods = c.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i].getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

@Test
public void Test05(){
try {
Class c = Class.forName("demo3.fanshe.Student");
Student stu = (Student) c.newInstance();
// stu.sex 獲取不到私有的屬性和私有方法
Field field = c.getDeclaredField("sex");
// 打開訪問私有屬性或者方法的開關
field.setAccessible(true);
System.out.println(field.get(stu));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}

@Test
public void Test06(){
try {
Class c = Class.forName("demo3.fanshe.Student");
Student stu = (Student) c.newInstance();
Method method = c.getDeclaredMethod("getSum", double.class);
// 打開訪問私有屬性或者方法的開關
method.setAccessible(true);
double result = (double) method.invoke(stu, 50.0);
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

類的生命週期(面試題):
01.加載 : 找到並加載咱們的.class文件
02.鏈接
   001.驗證
   002.準備 爲類中全部靜態數據開闢空間,而且賦予 默認值
   003.解析 把類中全部的符號引用, 轉換成直接引用
03.初始化
類中全部靜態數據開闢空間,而且賦予 初始值

相關文章
相關標籤/搜索