获取Class类的实例
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
Person person =new Student();
System.out.println("这个人是:"+person.name);
//方式一:通过对象获取
Class c1=person.getClass();
//方式二:forname获取
Class c2=Class.forName("Student");
System.out.println(c2.hashCode());
//方式三:通过.class获得
Class c3 = Student.class;
System.out.println(c3.hashCode());
//方式四:基本内置类型的包装类都有一个Type属性
Class c4=Integer.TYPE;
System.out.println(c4);
//获得父类类型
Class c5=c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
public String name;
public Person(){
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person{
public Student(){
this.name="学生";
}
}
class Teacher extends Person{
public Teacher(){
this.name="老师";
}
}
那些类可以有Class对象?
class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类。
interface:接口
[]:数组
enum:枚举
annotation:注解@interface
primitive type:基本数据类型
void
public class Test03 {
public static void main(String[] args) {
Class c1=Object.class;//类
Class c2=Comparable.class;//接口
Class c3=String[].class;//一维数组
Class c4=int[][].class;//二位数组
Class c5=Override.class;//注解
Class c6= ElementType.class;//枚举
Class c7=Integer.class;//基本数据类型
Class c8=void.class;//void
Class c9=Class.class;//Class
//快速换行复制ctrl+D
//多行选择复制alt
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
//只要元素类型与维度(一维数组跟多维数组)一样,就是同一个Class.
int[] a=new int[10];
int[] b=new int[100];
System.out.println(a.getClass().hashCode());
System.out.println(b.getClass().hashCode());
}
}
Java内存分析
类加载器
public static void main(String[] args) throws ClassNotFoundException {
//获取系统类的加载器
ClassLoader systemClassLoader=ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//获取系统类加载器的父类加载器-->扩展类加载器
ClassLoader parent =systemClassLoader.getParent();
System.out.println(parent);
//获取扩展类加载器的父类加载器-->根加载器(c/c++)
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);
//测试当前类是那个加载器加载的
ClassLoader classLoader=Class.forName("Test04").getClassLoader();
System.out.println(classLoader);
//测试JDK内置的类是那个加载器加载的
classLoader=Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader);
//如何获得系统类加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));
}
获取运行时类的完整结构
Field、Method、Constructor、Superclass、Interface、Annotation
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1=Class.forName("User");
User user = new User();
c1=user.getClass();
//获得类的名字
System.out.println(c1.getName());//获取包名+类名
System.out.println(c1.getSimpleName());//获得类名
//获得类的属性
Field[] fields=c1.getFields();//只能找到public属性
fields=c1.getDeclaredFields();//找到全部的属性
for(Field field:fields){
System.out.println(field);
}
//获得指定属性的值
Field name =c1.getDeclaredField("name");
System.out.println(name);
System.out.println("***********************");
//获得类的方法
Method[] methods = c1.getMethods();//获得本类及其父类的全部public方法
for(Method method:methods){
System.out.println("正常的:"+method);
}
methods=c1.getDeclaredMethods();//获得本类的所有方法
for(Method method:methods){
System.out.println("getDeclaredMethods:"+method);
}
//获得指定方法
//重载
Method getName=c1.getMethod("getName",null);
Method setName=c1.getMethod("setName",String.class);
//Method setName=c1.getMethod("getName",String.class);
System.out.println(getName);
System.out.println(setName);
//获得指定的构造器
System.out.println("***********************");
Constructor[] constructors = c1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor[] declaredConstructors = c1.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println("#"+declaredConstructor);
}
//获得指定的构造器
Constructor declaredConstructor=c1.getDeclaredConstructor(String.class,int.class,int.class);
System.out.println("指定:"+declaredConstructor);
}
有了Class对象,能做什么?
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得class对象
Class c1=Class.forName("User");
//构造一个对象
User user = (User) c1.newInstance();//本质是调用的无参构造器
System.out.println(user);
//通过构造器创建对象
Constructor declaredConstrcutor=c1.getDeclaredConstructor(String.class,int.class,int.class);
User user2=(User) declaredConstrcutor.newInstance("张苏杭",001,18);
System.out.println(user2);
//通过反射调用普通方法
User user3=(User)c1.newInstance();//通过反射创建一个对象
//通过反射获取一个方法
Method setName=c1.getDeclaredMethod("setName", String.class);
setName.invoke(user3,"苏杭");//激活invoke(对象,"方法的值")
System.out.println(user3.getName());
//通过反射操作属性
User user4=(User)c1.newInstance();
Field name=c1.getDeclaredField("name");
//不能直接操作私有属性,我们需要关闭程序的安全检测,属性或者方法的name.setAccessible(true)
name.setAccessible(true);//
name.set(user4,"书行");
System.out.println(user4.getName());
}
反射操作注解
要求:
代码:
import java.lang.annotation.*;
import java.lang.reflect.Field;
//练习反射操作注解
public class Test07 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class c1=Class.forName("Student2");
//通过反射获取注解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//获得注解的value的值。
Tablesu annotation1=(Tablesu)c1.getAnnotation(Tablesu.class);
String value = annotation1.value();
System.out.println(value);
//获得类指定的注解
Field f=c1.getDeclaredField("name");
Fieldsu annotation=f.getAnnotation(Fieldsu.class);
System.out.println(annotation.columnName());
System.out.println(annotation.type());
System.out.println(annotation.length());
}
}
@Tablesu("db_student")
class Student2{
@Fieldsu(columnName= "db_id",type = "int",length = 10)
private int id;
@Fieldsu(columnName= "db_age",type = "int",length = 10)
private int age;
@Fieldsu(columnName= "db_name",type = "varchar",length = 10)
private String name;
public Student2() {
}
public Student2(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "Student2{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablesu{
String value();
}
//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldsu{
String columnName();
String type();
int length();
}