反射

what是反射

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

类对象的方式

获取类对象的方式 一切反射相关的代码都从获得类对象开始

1、通过对应类(java.lang.Class)实例的类(Student.class)实例的个体getClass()方法获取
通用增删改的时候用到

Class clz = stu.getClass();

2、通过Class.forName(“类的全路径”); JDBC的驱动加载就用到反射技术

package com.houzhihong.demo;

public class Demo1 {

	public static void main(String[] args) throws ClassNotFoundException {
		//获取类对象的三种方式
		//1.class.forName("完整的类名")
		Class c1=Class.forName("com.demo.Student");
		//包和类名
		System.out.println(c1.getName());
		//类名
		System.out.println(c1.getSimpleName());
		
		
		//2.类名.class
		Class c2= Student.class;
		System.out.println(c2.getName());
		
		
		//3.类型对象.getclass
		Student stu = new Student();
		Class c3=stu.getClass();
		System.out.println(c3.getName());
		
		//同一个类的类对象只会创建一次 
		System.out.println(c1==c2);
		System.out.println(c2==c3);
	}

}

3、类实例.class 做通用查询用到

  Class clz  = Student.class;
  System.out.println(clz);
 Class c  = Student.class;
  Class clz  = Class.forName(c.getCanonicalName());
  System.out.println(clz);

4.利用反射进行实例化 反射的好处: 能够将未知的类进行实例化 ClassNotFoundException

通过反射的方式调用无参构造器来实例化对象

Object stu = clz.newInstance();//建造实例

5.通过反射的方式调用带有一个参数的构造器来实例化对象 Class Constructor描述了所以构造器方法

package com.houzhihong.demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Demo2 {
//实例化对象
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		// TODO Auto-generated method stub
		//实例化对象
//		Student stu = new Student();
		
		//反射机制实例化
		Class c1 =Class.forName("com.demo.Student");
		Student stu2=(Student)	c1.newInstance();
		
		//带有参的构造方法
		Constructor c2=	c1.getConstructor(String.class,String.class);
		Student stu3=(Student)	c2.newInstance("s686","aaa");
			System.out.println(stu3);
			
			
		//调用私有的构造方法
		Constructor c3=	c1.getDeclaredConstructor(Integer.class);
			c3.setAccessible(true);//打开权限
		Student stu4 =(Student) c3.newInstance(20);
		System.out.println(stu4);
		
	}

}

通过反射的方式调用带有一个参数的构造器来实例化对象

Constructor c = clz.getConstructor(String.class,String.class);
Student stu = (Student) c.newInstance("s001","zs");

6.通过反射的方式调用私有的构造器来实例化对象 Class
. getConstructor与getDeclaredConstructor
. getConstructor获取到的是public修饰的
. getDeclaredConstructor 获取的所有得构造器

Constructor c = clz.getDeclaredConstructor(Integer.class);
  c.setAccessible(true);
  Student stu = (Student) c.newInstance(23);

7.读写属性

package com.houzhihong.demo;

import java.lang.reflect.Field;

public class Demo3 {
//读写属性
	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		// TODO Auto-generated method stub
			Student s= new Student();
				//反射机制实例化
				Class c1 =Class.forName("com.demo.Student");
				//获取类对象的属性
			Field field=c1.getField("age");
				//给属性赋值
				field.set(s, 20);
				//得到类对象的值
				Integer age=(Integer)field.get(s);
				System.out.println(age);
				
				
			//获取私有的属性
			Field sidfield=	c1.getDeclaredField("sid");
			sidfield.setAccessible(true);
			sidfield.set(s, "s666");
			Object obj =sidfield.get(s);
			System.out.println(obj);
			
	}

}

8.反射的动态调用方法

package com.houzhihong.demo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo4 {
//动态调用方法
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Student s= new Student();
		s.setSname("打车");
		System.out.println(s);
		//反射机制实例化
		Class c1 =Class.forName("com.demo.Student");
	Method method=	c1.getMethod("hello", new Class[] {String.class});
		method.invoke(s, "滴滴");
		
		//调用私有方法
	Method method2=	c1.getDeclaredMethod("add", Integer.class,Integer.class);
		method2.setAccessible(true);
	Integer i =(Integer)	method2.invoke(s, 50,50);
		System.out.println(i);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值