J2EE反射

导读:本篇文章讲解 J2EE反射,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

学习目标看一下

J2EE反射

 

1  什么是反射

反射是java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法

注:放一个学生实体类给大家做讲解

package com.lsy.model.reflect;

public class Student {
	private String sid;

	private String sname;

	public Integer age;
	
	static{
		System.out.println("加载进jvm中!");
	}

	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());
	}
}

 该类有很多公有,私有,无参,有参方法,放方便下面的讲解

2  类类(三种书写方法)

Class.forName(完整类型)

类名.class

对象.getClass()

J2EE反射

三  反射实例化

getConstructor与getDeclaredConstructor的区别

两者的区别是一个可以获取有参无参的构造方法,一个可以获取私有构造方法

newInstance()方法

这个方法是调用了无参构造,因为在框架底层,是通过无参这个类来进行实例化

package com.lsy.model.reflect;

import java.lang.reflect.Constructor;

/**
 * 反射实例化
 * @author zjjt
 *
 */
public class Demo2 {
	public static void main(String[] args) throws Exception {
		//拿到类类的类实例  记住后面的类要点出来
		Class<Student> stuClz1=(Class<Student>)Class.forName("com.lsy.model.reflect.Student");
		Student stu1 = (Student)stuClz1.newInstance();
		stu1.hello();
		//在框架的底层,是通过无参一个类进行实例化
		
		//反射调用有参构造器
		//getConstructor与getDeclaredConstructor的区别
		Constructor<Student> c = stuClz1.getConstructor(String.class);
		Student s1=c.newInstance("s001");
		
		Constructor<Student> c2 = stuClz1.getConstructor(String.class,String.class);
		Student s2=c2.newInstance("s001","zs");
		
		Constructor<Student> c3 = stuClz1.getDeclaredConstructor(Integer.class);
		//打开访问权限
		c3.setAccessible(true);
		Student s3=c3.newInstance(26);
		//反射可以将有参,无参,私有构造器实例化
	}
}

注意一些报错:

java.lang.IllegalAccessException  这个报错是访问权限的问题,所以下一步我们要打开访问权限,

也就是setAccessIble()

四  反射动态方法调用

getDeclaredMethod()与getMethod()

package com.lsy.model.reflect;

import java.lang.reflect.Method;

/**
 * 反射动态方法调用
 * @author zjjt
 *
 */
public class Demo3 {
	public static void main(String[] args) throws Exception {
		Class<Student> stuClz1=(Class<Student>)Class.forName("com.lsy.model.reflect.Student");
		Student s = stuClz1.newInstance();
		Method m1 = stuClz1.getDeclaredMethod("hello");
		//invoke参数一:类实例,在这里指的是Student类实例
		//invoke参数二:当前被调用的方法,传递的参数值
		
		//invoke的返回值就是被反射调用的方法的返回值,如果被调用的方法是void,那么返回null
		System.out.println( m1.invoke(s));
		
		Method m2 = stuClz1.getDeclaredMethod("hello",String.class);
		System.out.println(m2.invoke(s, "zs"));
		//取私用方法
		Method m3 = stuClz1.getDeclaredMethod("add",Integer.class,Integer.class);
		//打开访问权限
		m3.setAccessible(true);
		System.out.println(m3.invoke(s, 10,5));
	
	}
}

五  反射读写属性

getDeclaredField()

package com.lsy.model.reflect;

import java.lang.reflect.Field;

/**
 * 反射读写属性
 * @author zjjt
 *
 */
public class Demo4 {
	public static void main(String[] args) throws Exception {
		Class<Student> stuClz1=(Class<Student>)Class.forName("com.lsy.model.reflect.Student");
		Student s=stuClz1.newInstance();
		Field f = stuClz1.getDeclaredField("sname");
		f.setAccessible(true);
		//反射写属性
		f.set(s, "zs");
		System.out.println(s.getSname());
		//反射读属性
		System.out.println(f.get(s));
		
		//比较oop与反射读取属性值的方式
		Student st=new Student("s002","ls");
		st.age=22;
		System.out.println(st.getSid());
		System.out.println(st.getSname());
		System.out.println(st.age);
		//以上是oop的获取方式
		
		System.out.println("----------------");
		//反射获取该对象所有属性值
		Field[] fields=stuClz1.getDeclaredFields();
		for (Field ff : fields) {
			ff.setAccessible(true);
			System.out.println(ff.getName()+"--"+ff.get(st));
		}
		
		
		
		
	}
}

f.set(s, “zs”);是反射属性

f.get(s);是反射属性

getDeclaredFields()

可以通过遍历的方式获取类里面的每个属性,相比于oop来说,取值更方便

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12257.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!