反射

本文介绍了Java反射机制,它能在运行状态动态获取类信息和调用对象方法。先阐述反射概述,提及优缺点,接着介绍获得类对象的三种方式,还涉及实例化对象、动态调用方法等内容,最后说明了通过Field的getModifiers()方法获取字段修饰符。

反射

反射的概述
获得类对象的方式
实例化对象
动态调用方法
读写属性
访问修饰符
反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。

反射的优点:增加程序的灵活性
反射的缺点:1性能第一 2安全限制 3内部暴露

获得类对象的方式

一切反射相关的代码都从获得类对象开始,先创建一个实体类

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

}在这里插入代码片

以下是获取类对象的几种方式
3种获取方式:
1 、类名.class;
2 、对象名.getClass();
3 、Class.forName(全限定名/全路径名);

 package com.zking.refle;
    
        /**
         * 获取类对象的方式
         * 		获取java。lang。class的一个类实例
 * 		-->对于本堂课而言,Student.class
 * 		1.通过对应类(java。lang。class)实例的类(Student.class)的getClass()方法获取
 * 			通用增删改的时候用到
 * 		2.通过Class。forNmae(“类的全路径”);JDBC的驱动加载就是用的反射技术
 * 		3.类实例.class
 * 			做通用查询的时候用到
 * 		
 * @author huguiyun
 *
 */

public class Demo2 {
	public static void main(String[] args) throws Exception {
//		Student stu = new Student();
//		Class clz = stu.getClass();方式一
		
//		Class clz = Class.forName("com.zking.refle.Student");方式二
		
//		Class clz = Student.class;方式三
//		System.out.println(clz);
	}
}

实例化对象

	Class clz = Student.class;
//		通过反射的方式调用无参构造器来实例化对象
//		Student stu = (Student) clz.newInstance();
		
//		通过反射的方式调用带有一个参数的构造器来实例化对象
//		Constructor c =  clz.getConstructor(String.class);
//		Student stu = (Student) c.newInstance("s001");
		
		
//		通过反射的方式调用带有两个参数的构造器来实例化对象
//		Constructor c =  clz.getConstructor(String.class,String.class);
//		Student stu = (Student) c.newInstance("s001","zs");
		
		
//		通过反射的方式调用带有私有的构造器来实例化对象
//		getConstructor与getDeclaredConstructor的区别
//		getConstructor获取是public 的
//		getDeclaredConstructor获取所欲的构造器
		Constructor c =  clz.getDeclaredConstructor(Integer.class);
		c.setAccessible(true);//使私有化的方法变得可用
		Student stu = (Student) c.newInstance(23);

动态调用方法

	Class<Student> clz=Student.class;
	
	//Method m = clz.getDeclaredMethod("hello");//无参方法
	//Object invoke = m.invoke(clz.newInstance());
	//System.out.println(invoke);
	
	//第一个参数指的是类类的类实例
	//第二个参数指的是调用方法携带的参数(没有参数就不填)
	//Method类的invoke方法的返回值就是被调用的方法的返回值
	//如果被调用的方法没有返回值,那么返回null
	
//		Method m = clz.getDeclaredMethod("hello",String.class);//有参方法
//		m.invoke(clz.newInstance(), "xxx");

	Method m = clz.getDeclaredMethod("add",Integer.class,Integer.class);//私有化方法
	m.setAccessible(true);
	Object invoke = m.invoke(clz.newInstance(), 10,5);
	System.out.println(invoke);

读写属性、

Student stu=new Student("s1","aa");
		stu.age=21;
		
		Class clz=stu.getClass();
		
		//获取属性值
//		Field[] fields = clz.getDeclaredFields();
//		for (Field field : fields) {
//			field.setAccessible(true);
//			System.out.println(field.getName()+":"+field.get(stu));
//		}
		
		//设置属性值  公有的
//		Field field = clz.getDeclaredField("age");
//		field.set(stu, 12);
//		System.out.println(stu.age);
		
		//设置私有的属性值
		Field field = clz.getDeclaredField("sname");
		field.setAccessible(true);
		field.set(stu, "bb");
		System.out.println(stu.getSname());

访问修饰符

JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。

其中,该修饰符是java.lang.reflect.Modifier的静态属性。

对应表如下:

PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048

int java.lang.reflect.Field.getModifiers()
以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符

boolean java.lang.reflect.Modifier.isPublic(int mod)
如果整数参数包括 public 修饰符,则返回 true,否则返回 false

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值