6.03反射

package org.westos.反射博客练习;
/*
 * 什么是反射?
 * 		反射就是通过获取class字节码文件对象/Class类对象,
 * 		来获取类对象的成员变量,构造方法,成员方法
 * 创建Class类对象的三种方式:
 * 		1.Class.forName(包名.类名)
 * 		2.对象名.getClass()
 * 		3.类名.class
 * */
public class Text1 {
	public static void main(String[] args) throws ClassNotFoundException {
		Student s1 =new Student();
		Student s2 = new Student();
		Class c1 = Class.forName("org.westos.反射博客练习.Student");
		Class c2 = s2.getClass();
		Class c3 = Student.class;
		System.out.println(c1==c2);
		System.out.println(c3==c2);
		System.out.println(c1==c3);
	}
}
package org.westos.反射博客练习;

import java.lang.reflect.Constructor;

//通过反射获取构造方法
public class Text2 {
	public static void main(String[] args) throws Exception {
		//创建Class类对象
		Class c = Class.forName("org.westos.反射博客练习.Student");
		//获取构造方法,返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
		Constructor[] cons = c.getConstructors();
		//遍历
		for(Constructor con:cons) {
			System.out.println(con);
		}
//		public org.westos.反射博客练习.Student(java.lang.String,int)
//		public org.westos.反射博客练习.Student()
		System.out.println("-------------------------------------------");
		//下面这个方法可以获取公共与私有的构造方法
		Constructor[] dcons = c.getDeclaredConstructors();
		//遍历
		for(Constructor dcon:dcons) {
			System.out.println(dcon);
		}
		System.out.println("----------------------------------------------");
		//通过公共构造方法创建对象
		//通过反射创建对象,需要先获取单个的构造方法
		Constructor c1 = c.getConstructor(String.class,int.class);
		//调用Constructor的newInstance()方法,对于带参构造在括号中传入参数,无参则不传入
		Object obj1 = c1.newInstance("张三",12);
		System.out.println(obj1);
		System.out.println("-----------------------------------------------");
		
		//通过反射获取私有的构造方法再创建对象
		//获取单个的构造方法,因为为私有,使用declearConstructor()
		Constructor dc1 = c.getDeclaredConstructor(String.class);
		//public void setAccessible(boolean flag),将此对象的 accessible 标志设置为指示的布尔值。
		//该方法由Constructor的父类提供
		//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
		//值为 false 则指示反射的对象应该实施 Java 语言访问检查。 
		dc1.setAccessible(true);
		Object obj2 = dc1.newInstance("李四");
		System.out.println(obj2);
	}
}
package org.westos.反射博客练习;

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

/**
 * 通过反射获取成员变量
 * */
public class Text3 {
	public static void main(String[] args) throws Exception {
		//创建Class类对象
		Class c = Class.forName("org.westos.反射博客练习.Student");
		//创建Constructor对象
		Constructor con = c.getConstructor();
		//通过反射创建对象
		Object obj = con.newInstance();
		//获取Filed公共成员变量,返回一个数组
		//注意对于那些没有权限修饰符的成员变量(如String add),Java虽然默认提供public,但是在这里并不会返回它
		Field[] f1 = c.getFields();
		for(Field f:f1) {
			System.out.println(f);
		}
		System.out.println("-------------------------------");
		
		
		//获取Filed公共与私有的成员变量
		//getDeclearFields()方法可以返回没有权限修饰符的成员变量
		Field[] f2 = c.getDeclaredFields();
		for(Field f:f2) {
			System.out.println(f);
		}
		System.out.println("----------------------------------");
		//通过Field类修改对象的成员变量
		//公共成员变量
		Field age = c.getField("age");
		//传入参数
		//public void set(Object obj, Object value),将指定对象变量上此 Field对象表示的字段设置为指定的新值。
		age.set(obj,12);
		System.out.println(obj);
		System.out.println("-------------------------------------");
		
		//私有成员变量
		Field name = c.getDeclaredField("name");
		//取消访问权限检查
		name.setAccessible(true);
		//传入参数
		name.set(obj, "张三");
		System.out.println(obj);
	}
}
package org.westos.反射博客练习;

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

//通过反射获取返回值
public class Text4 {
	public static void main(String[] args) throws Exception {
		//创建Class类对象
		Class c = Class.forName("org.westos.反射博客练习.Student");
		//创建对象
		Constructor con = c.getConstructor(String.class,int.class);
		Object obj = con.newInstance("张三",12);
		//获取公共方法
		Method[] m1 = c.getMethods();
		for(Method m:m1) {
			System.out.println(m);
		}
		System.out.println("------------------------------");
		
		//获取公共与私有的方法
		Method[] m2 = c.getDeclaredMethods();
		for(Method m:m2) {
			System.out.println(m);
		}
		System.out.println("-----------------------------------");
		
		
		//调用方法
		//公共方法
		Method method1 = c.getMethod("method1");
		method1.invoke(obj);
		//私有方法
		Method method2 = c.getDeclaredMethod("method2", String.class);
		//取消访问权限检查
		method2.setAccessible(true);
		//调用
		 Object objname = method2.invoke(obj, "张三");
		 System.out.println(objname);
	}
}
package org.westos.反射博客练习;

import java.lang.reflect.Method;
import java.util.ArrayList;

//使用反射在加入泛型的ArrayList集合中传入,其他类型的数据
public class Text5 {
	public static void main(String[] args) throws Exception {
		ArrayList<Integer> list = new ArrayList<>();
		Class c = Class.forName("java.util.ArrayList");
		Method add = c.getMethod("add", Object.class);
		//添加String类型数据
		add.invoke(list, "hello");
		add.invoke(list, "world");
		add.invoke(list,"Java");
		//输出集合
		System.out.println(list);
		//[hello, world, Java]
	}
}

自定义类

package org.westos.反射博客练习;

public class Student {
	private String name;
	public int age;
	String add;
	
	//set/get方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	//公共无参构造
	public Student() {
		super();
	}
	//公共带参构造
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	//私有带参构造
	private Student(String name) {
		super();
		this.name = name;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	//公共的,没有返回值,没有传入参数的方法
	public void method1() {
		System.out.println("公共的,没有返回值,没有传入参数的方法");
	}
	//私有的,还有返回值,有传入参数的方法
	private String method2(String name) {
		return "私有的,还有返回值,有传入参数的方法                  "+name;
	}
}





猜你喜欢

转载自blog.csdn.net/ws1995_java/article/details/80614240