反射:是一种获取类信息的能力。
类是生成对象的模版,一个类可以生成多个对象。

堆:生成对象;方法区:存放类对象(--->类信息)
1.磁盘阶段 Class clazz=Class.forName("全类名");
2.类对象阶段 Class clazz=类名.class;
3.运行时阶段 Class clazz=对象名.getClass()

java
package com.qcby.test;
public class Animal {
private String name = "小花猫";
public Integer age = 18;
String sex = "男";
protected String color = "花色";
public Animal() {
System.out.println("这是无参构造方法");
}
public Animal(String name) {
System.out.println("这是有参构造方法");
}
private Animal(String name, String color) {
System.out.println("这是普通方法");
}
private void run(String name){
System.out.println("跑的很快");
}
public void eat(String name,Integer age){
System.out.println("吃的很多");
}
void sleep(){
System.out.println("睡得Many");
}
protected void show(){
System.out.println("这是受保护的方法");
}
}
java
package com.qcby.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception{
Class clazz1 = Class.forName("com.qcby.test.Animal");
//获取类信息
System.out.println(clazz1.getName());
//获取变量信息
Field[] fields = clazz1.getFields(); //获取public变量
for (Field field : fields) {
System.out.println(field.getName());
}
Field[] fields1 = clazz1.getDeclaredFields(); //获取所有变量
for (Field field : fields1) {
System.out.println(field.getName());
}
System.out.println("-----------------------------");
Field ageFiled = clazz1.getDeclaredField("age"); //getField("age");
System.out.println(ageFiled);
//private defulted protected 度需要使用Declared
Field colorFiled = clazz1.getDeclaredField("color");
System.out.println(colorFiled);
Field sexFiled = clazz1.getDeclaredField("sex");
System.out.println(sexFiled);
Field nameFiled = clazz1.getDeclaredField("name");
System.out.println(nameFiled);
//方法
System.out.println("-----------------------------");
Method[] methods = clazz1.getMethods(); //获取public方法
for (Method method : methods) {
System.out.println(method.getName());
}
System.out.println("-----------------------------");
Method[] methods1 = clazz1.getDeclaredMethods(); //获取所有方法
System.out.println("-----------------------------");
//getDeclaredMethod
Method eatMethod = clazz1.getDeclaredMethod("eat", String.class, Integer.class);
System.out.println("-------------------------");
Method runMethod = clazz1.getDeclaredMethod("run", String.class);
Method sleepMethod = clazz1.getDeclaredMethod("sleep");
Method showMethod = clazz1.getDeclaredMethod("show");
System.out.println("-------------------------");
Constructor[] constructor = clazz1.getDeclaredConstructors();
Constructor constructor1 = clazz1.getDeclaredConstructor(String.class);
Constructor constructor2 = clazz1.getDeclaredConstructor(String.class, String.class);
}
}
对类信息的使用:



注解
内置注解、元注解、自定义注解。


自定义注解:
