反射的深入了解
一、提供丰富的类
代码语言:javascript复制package com.lanson.test02;
//作为一个父类
public class Person {
//属性
private int age;
public String name;
//方法
private void eat(){
System.out.println("Person---eat");
}
public void sleep(){
System.out.println("Person---sleep");
}
}
package com.lanson.test02;
//Student作为子类
public class Student extends Person {
//属性:
private int sno;//学号
double height;//身高
protected double weight;//体重
public double score;//成绩
//方法:
public String showInfo(){
return "我是一名三好学生";
}
private void work(){
System.out.println("我以后会找工作--》成为码农 程序员 程序猿 程序媛");
}
//构造器
public Student(){
System.out.println("空参构造器");
}
private Student(int sno){
this.sno = sno;
}
Student(int sno,double weight){
this.sno = sno;
this.weight = weight;
}
}
二、获取字节码信息的四种形式
代码语言:javascript复制package com.lanson.test02;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//案例:以Person的字节码信息为案例
//方式1:通过getClass()方法获取
Person p = new Person();
Class c1 = p.getClass();
System.out.println(c1);
//方式2:通过内置class属性:
Class c2 = Person.class;
System.out.println(c2);
System.out.println(c1==c2);
//注意:方式1和方式2 不常用
//方式3:--》用的最多:调用Class类提供的静态方法forName
Class c3 = Class.forName("com.lanson.test02.Person");
//方式4:利用类的加载器(了解技能点)
ClassLoader loader = Test.class.getClassLoader();
Class c4 = loader.loadClass("com.lanson.test02.Person");
}
}
三、可以作为Class类的实例的种类
Class类的具体的实例:
(1)类:外部类,内部类
(2)接口
(3)注解
(4)数组
(5)基本数据类型
(6)void
验证:
代码语言:javascript复制package com.lanson.test02;
public class Demo {
public static void main(String[] args) {
/*
Class类的具体的实例:
(1)类:外部类,内部类
(2)接口
(3)注解
(4)数组
(5)基本数据类型
(6)void
*/
Class c1 = Person.class;
Class c2 = Comparable.class;
Class c3 = Override.class;
int[] arr1 = {1,2,3};
Class c4 = arr1.getClass();
int[] arr2 = {5,6,7};
Class c5 = arr2.getClass();
System.out.println(c4==c5);//结果:true .同一个维度,同一个元素类型,得到的字节码就是同一个
Class c6 = int.class;
Class c7 = void.class;
}
}