j2ee_07_反射

1.什么是反射?
反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。

2.如何得到类对象
一切反射相关的代码都从获得类对象开始
3种获取方式:
2.1 类名.class;
2.2 对象名.getClass();
2.3 Class.forName(全限定名/全路径名)

3.根据类得到类名(全限定名/全路径名)
Class cla = Class.forName(“com.zking.reflect.entity.Student”);
1)cla.getName(); -->获取全限定名
2)cla.getSimpleName(); -->获取类名
3)cla.getPackage(); -->获取包名

	//传统方式实例化对象
	//Student stu = new Student();
	//反射机制实例化对象
	Class cla = Class.forName(全限定名/全路径名);
	//反射机制获得对象
	Student stu = (Student)cla.newInstance();
	System.out.println("类的全路径名:"+cla.getName());
	System.out.println("类的简单类名:"+cla.getSimpleName());
	System.out.println("类的包名:"+cla.getPackage());

4.根据类得到类的属性

//1.获得类的属性(公共的,私有的,受保护的,最终的等等)
	//1.1获得类的单个属性(公共的)
	Field field = cla.getField("age");
	
	//1.2获得单个属性(公共的,私有的,受保护的,最终的等等)
	Field field = cla.getDeclaredField("sname");
	System.out.println("获得属性名:"+field.getName());
	System.out.println("获得属性的类型:"+field.getType());
	System.out.println("获得属性的访问修饰符:"+field.getModifiers());

	//1.3赋值和取值
	//第一个参数:类的对象	//第二个参数:所要赋值的值
	//设置权限
	field.setAccessible(true);
	field.set(stu, "张三");
	//取值
	Object obj = field.get(stu);
	System.out.println("sname"+obj);
//1.4获取类中的所有属性
	Field [] fields = cla.getDeclaredFields();
	for (Field field : fields) {
		System.out.println("-----------");
		System.out.println("获得属性名:"+field.getName());
		System.out.println("获得属性的类型:"+field.getType());
		System.out.println("获得属性的访问修饰符:"+field.getModifiers());
	}
field.getName();			-->获取属性名			
filed.getType();			-->获取属性类型		
field.getModifiers();			-->获取属性访问修饰符	
field.set(Object,Object); 		-->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;	
field.get(Object);			-->获取属性值,参数:要获取属性值的对象				
field.getDeclaredField(“属性名”);	-->获取单个属性(私有、公有、受保护、默认、静态)	
field.getDeclaredFields();		-->获取所有属性(私有、公有、受保护、默认、静态)

5.根据类得到类的方法
//无参无返回、无参有参会、有参无返回、有参有返回

	//2.获取类的方法
	//方法种类:无参无返回,无参有返回,有参有返回,有参无返回
	//2.1获取类中的单个方法(公共的)
	//第一个参数:方法名
	//第二个参数:可变参数
	Method method = cla.getMethod("方法名", 可变参数(看方法里面的参数个数));
	//执行方法,并得到方法的返回值
	Object obj = method.invoke(方法对应的类对象, 参数值);
	System.out.println(obj);
//2.2获取类中的单个方法(公共的,私有的,受保护的,最终的等等)
	Method method = cla.getDeclaredMethod(方法名, Integer.class,Integer.class);
	//如果是私有的方法  设置访问权限
	method.setAccessible(true);
	//执行方法
	Object val = method.invoke(stu, 10,7);
	System.out.println(val);

	//2.3获取类中的所有方法
	Method[] methods = cla.getMethods();
	for (Method method : methods) {
		System.out.println("------------------");
		System.out.println("方法名:"+method.getName());
		System.out.println("方法的访问修饰符:"+method.getModifiers());
		System.out.println("方法的返回类型:"+method.getReturnType());
	}	

cla.getMethod();			-->获取单个公有方法
cla.getDeclaredMethod();		-->获取单个方法(包括私有、受保护、默认、公有)
cla.getMethods();			-->获取所有公有方法
cla.getDeclaredMethods();		-->获取所有的方法(包括私有、受保护、默认、公有)

6.根据类得到类的构造方法
cla.getConstrutor(); -->获取单个公有构造方法
cla.getDeclaredConstrutor(); -->获取单个构造方法(包括私有、受保护、默认、公有)
cla.getConstrutors(); -->获取所有的公有构造方法
cla.getDeclaredConstrutors(); -->获取所有的构造方法(包括私有、受保护、默认、公有)

7.根据类得到类的实现接口列表
Class[] interface=cla.getInterfaces(); -->获取类对象中所有实现接口列表

我举例对应的实体类:

public class Student {
	private String sid;

	private String sname;

	public Integer age;

	public Student() {
		super();
		System.out.println("调用无参构造方法创建了一个学生对象");
	}

	public Student(String sid) {
		super();
		this.sid = sid;
		System.out.println("调用带一个参数的构造方法创建了一个学生对象");
	}

	public Student(String sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
	}

	@SuppressWarnings("unused")
	private Student(Integer age) {
		System.out.println("调用Student类私有的构造方法创建一个学生对象");
		this.age = age;
	}

	public String getSid() {
		return sid;
	}

	public void setSid(String sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public void hello() {
		System.out.println("你好!我是" + this.sname);
	}

	public void hello(String name) {
		System.out.println(name + "你好!我是" + this.sname);
	}

	@SuppressWarnings("unused")
	private Integer add(Integer a, Integer b) {
		return new Integer(a.intValue() + b.intValue());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43582260/article/details/91407826