package com.j2se.g_reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class AppTest {

	public static void main(String[] args) throws Exception {
		// 得到Person的Class对象实例(的三种方式)
		Class<Person> clazz = Person.class;
		Class clazz2 = new Person().getClass();
		Class clazz3 = Class.forName("com.j2se.g_reflect.Person");

		// 获取类中的信息(字段、方法、构造器)
		Field[] fields = clazz.getFields(); // 获取所有公共的字段信息,包括继承过来的字段
		Method[] methods = clazz.getMethods(); // 获取所有公共的方法信息,包括继承过来的方法
		Constructor[] constructors = clazz.getConstructors();

		// 显示类的信息
		System.out.println("类的全限定名称:" + clazz.getName());
		System.out.println("类的简单名称:" + clazz.getSimpleName());
		System.out.println("类的修饰符:" + clazz.getModifiers());
		System.out.println("类的父类类型:" + clazz.getSuperclass());
		System.out.println("类的实现的接口:" + Arrays.toString(clazz.getInterfaces()));

		System.out.println("=================");

		// 显示信息
		for (Field field : fields) {
			System.out.println("字段的修饰符:" + field.getModifiers());
			System.out.println("字段类型:" + field.getType());
			System.out.println("字段名:" + field.getName());
			// System.out.println("字段值:" +field.get(instance));
			System.out.println();
		}
		System.out.println("=========");


		for (Method method : methods) {
			System.out.println("方法的修饰符:" + method.getModifiers());
			System.out.println("方法的返回值类型:" + method.getReturnType());
			System.out.println("方法的参数类型:" + Arrays.toString(method.getParameterTypes()));
			System.out.println("方法的名称:" + method.getName());
			System.out.println();
		}

		System.out.println("=========");
		for (Constructor c : constructors) {
			System.out.println("构造器的修饰符:" + c.getModifiers());
			System.out.println("构造器的名称:" + c.getName());
			System.out.println("构造器的参数的类型:" + Arrays.toString(c.getParameterTypes()));
			System.out.println();
		}
	}
}

运行结果:

类的全限定名称:com.j2se.g_reflect.Person
类的简单名称:Person
类的修饰符:1
类的父类类型:class java.lang.Object
类的实现的接口:[interface java.io.Serializable]
=================
字段的修饰符:1
字段类型:class java.lang.String
字段名:name

字段的修饰符:1
字段类型:class java.lang.Character
字段名:gender

=========
方法的修饰符:1
方法的返回值类型:int
方法的参数类型:[]
方法的名称:getAge

方法的修饰符:1
方法的返回值类型:void
方法的参数类型:[int]
方法的名称:setAge

方法的修饰符:17
方法的返回值类型:void
方法的参数类型:[]
方法的名称:wait

方法的修饰符:17
方法的返回值类型:void
方法的参数类型:[long, int]
方法的名称:wait

方法的修饰符:273
方法的返回值类型:void
方法的参数类型:[long]
方法的名称:wait
package com.j2se.g_reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class AppTest2 {

	public static void main(String[] args) throws Exception {
		// 得到Person的Class对象实例(的三种方式)
		Class<Person> clazz = Person.class;
		// Class clazz2 = new Person().getClass();
		// Class clazz3 = Class.forName("<span style="font-family: Arial, Helvetica, sans-serif;">com.j2se.g_reflect</span>.Person");

		// 创建对象的实例(使用无参的构造器时一般用这个方法)
		Object instance = clazz.newInstance(); // 使用默认的构造方法创建对象的实例
		System.out.println(instance);

		// 创建对象的实例2(使用有参的构造器时只能使用这个方法)
		Constructor c = clazz.getConstructor(String.class, int.class); // 获取有指定参数列表的构造器
		Object instance2 = c.newInstance("张三", 20);
		System.out.println(instance2);

		// 对于字段的操作
		Field field = clazz.getField("name");
		Object value = field.get(instance2); // 获取字段的值
		System.out.println(field.getName() + " = " + value);

		// 改变字段的值
		field.set(instance2, "李四");
		value = field.get(instance2); // 获取字段的值
		System.out.println(field.getName() + " = " + value);
		
		// 对于方法的操作(调用)
		Method method = clazz.getMethod("getAge");
		Integer age = (Integer)method.invoke(instance2);
		System.out.println("getAge() = " + age);
	}
}



执行结果:

com.j2se.g_reflect.Person@150bd4d
com.j2se.g_reflect.Person@1888759
name = 张三
name = 李四
getAge() = 20



第三个Demo:

package com.j2se.g_reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class AppTest3 {

	public static void main(String[] args) throws Exception {
		// 得到Person的Class对象实例(的三种方式)
		Class<Person> clazz = Person.class;
		Class clazz2 = new Person().getClass();
		Class clazz3 = Class.forName("com.j2se.g_reflect.Person");

		Object instance = new Person("王五", 21);

		// 获取类中的信息(字段、方法、构造器)
		// Field[] fields = clazz.getFields(); // 获取所有公共的字段信息,包括继承过来的字段
		// Method[] methods = clazz.getMethods(); // 获取所有公共的方法信息,包括继承过来的方法
		// Constructor[] constructors = clazz.getConstructors();

		Field[] fields = clazz.getDeclaredFields(); // 获取所有在本类中声明的字段信息,包括所有修饰符的字段(当然也包括私有的)
		Method[] methods = clazz.getDeclaredMethods();
		Constructor[] constructors = clazz.getDeclaredConstructors();

		// 显示信息
		for (Field field : fields) {
			
			field.setAccessible(true); // 强制访问(暴力反射)
			
			System.out.println("字段的修饰符:" + field.getModifiers());
			System.out.println("字段类型:" + field.getType());
			System.out.println("字段名:" + field.getName());
			System.out.println("字段值:" + field.get(instance));
			System.out.println();
		}

		System.out.println("=========");

		for (Method method : methods) {
			// method.setAccessible(true);
			System.out.println("方法的修饰符:" + method.getModifiers());
			System.out.println("方法的返回值类型:" + method.getReturnType());
			System.out.println("方法的参数类型:" + Arrays.toString(method.getParameterTypes()));
			System.out.println("方法的名称:" + method.getName());
			System.out.println();
		}

		System.out.println("=========");
		for (Constructor c : constructors) {
			System.out.println("构造器的修饰符:" + c.getModifiers());
			System.out.println("构造器的名称:" + c.getName());
			System.out.println("构造器的参数的类型:" + Arrays.toString(c.getParameterTypes()));
			System.out.println();
		}
	}
}



执行结果:

字段的修饰符:1
字段类型:class java.lang.String
字段名:name
字段值:王五

字段的修饰符:2
字段类型:int
字段名:age
字段值:21

字段的修饰符:1
字段类型:class java.lang.Character
字段名:gender
字段值:null

=========
方法的修饰符:2
方法的返回值类型:class java.lang.String
方法的参数类型:[]
方法的名称:getName

方法的修饰符:2
方法的返回值类型:void
方法的参数类型:[class java.lang.String]
方法的名称:setName

方法的修饰符:1
方法的返回值类型:int
方法的参数类型:[]
方法的名称:getAge

方法的修饰符:1
方法的返回值类型:void
方法的参数类型:[int]
方法的名称:setAge

=========
构造器的修饰符:1
构造器的名称:com.j2se.g_reflect.Person
构造器的参数的类型:[]

构造器的修饰符:2
构造器的名称:com.j2se.g_reflect.Person
构造器的参数的类型:[class java.lang.String]

构造器的修饰符:1
构造器的名称:com.j2se.g_reflect.Person
构造器的参数的类型:[class java.lang.String, int]



package com.j2se.g_reflect;

import java.lang.reflect.Modifier;

public class AppTest4 {

	public static void main(String[] args) throws Exception {
		// 得到Person的Class对象实例(的三种方式)
		Class<Person> clazz = Person.class;

		// 获取类的修饰符
		int modifier = clazz.getModifiers();

		System.out.println("是static吗?" + Modifier.isStatic(modifier));
		System.out.println("是private吗?" + Modifier.isPrivate(modifier));
		System.out.println("是public吗?" + Modifier.isPublic(modifier));
	}
}