0
点赞
收藏
分享

微信扫一扫

反射机制讲解

皮皮球场 2022-04-02 阅读 94
java-ee

文章目录

  • 前言
  • 一、反射机制的作用?
  • 二、1.Class对象的获取
  • 2.反射机制实例化对象
  • 3.反射机制调用方法
  • 4.反射读写属性


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、反射机制的作用?

  反射是java语言中的一种机制,

通过这种机制可以动态的实例化对象、读写属性、调用方法  

二、Class对象的获取

1.类类 

Class.forName(完整类名)

 类名.class  
对象getClass(0
 

通过class类型生成其他对象,生成不同的实体,赋予不同的值

代码如下(示例):

public class Test {

    public static void main(String[] args) throws ClassNotFoundException {
        // TODO Auto-generated method stub
//1.class.forName(),得到student的模板
Class <Student>    stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
//2.Student.class
Class <Student>     stuClazz01=Student.class;    
//3.对象.getClass    
Student stu=new Student();    
Class<Student> stuClazz02=(Class<Student>)stu.getClass();
    }

}

2.反射机制实例化对象

如果一个类里面没有构造函数,jvm虚拟机就会自动实现默认构造函数

getConstructor

newinstance

getDeclaredConstructor  

代码如下(示例):

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

public class Test02 {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
//1.直接new对象
Student stu =new Student();
stu.setSname("zs");

//2.反射机制调用方法
Class <Student>    stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
Student stu02=stuClazz.newInstance();
stu02.setSid("01");
stu02.setSname("zs");

//通过反射来获取Method
Method method=stuClazz.getMethod("hello");
Object obj=method.invoke(stu02);
System.out.println(obj);

Method m02=stuClazz.getMethod("hello", String.class);
m02.invoke(stu02, "hhsj");

//有返回值的情况,且是私有方法
Method m03=stuClazz.getDeclaredMethod("add", Integer.class,Integer.class);
m03.setAccessible(true);
int sum=(int)m03.invoke(stu02, 3,3);
System.out.println(sum);

    }

}

3.反射机制调用方法

getDeclaredMethod  
getMethod  

import java.lang.reflect.Constructor;

public class Test03 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
//1.直接new对象
Student stu =new Student();
//2.反射
Class <Student>	stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
Constructor<Student> c1=stuClazz.getConstructor();
Student stu02=c1.newInstance();

stu02.setSid("01");
stu02.setSname("zs");

System.out.println("stu02="+stu02.getSname());

Constructor<Student> stuCon=stuClazz.getConstructor(String.class);
Student stu03=stuCon.newInstance("li");
System.out.println("stu03="+stu03.getSid());

	}

}

4.反射读写属性

getDeclaredFields

import sun.text.resources.cldr.es.FormatData_es_419;

public class Test04 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub

//2.反射
Class <Student>	stuClazz=(Class<Student>)Class.forName("com.zking.reflect.Student");
Student stu02=stuClazz.newInstance();

stu02.setSid("01");
stu02.setSname("zs");
stu02.setAge(20);

//动态的获取属性的值
Field f=stuClazz.getField("age");
int age=(int)f.get(stu02);
System.out.println(age);

//获取私有的属性
Field f02=stuClazz.getDeclaredField("sname");
f02.setAccessible(true);
String name=(String)f.get(stu02);
System.out.println(name);

f02.set(stu02, "hhsj");
System.out.print("****"+stu02.getSname());

Field[] fs=stuClazz.getDeclaredFields();
for(Field f04:fs){
	f04.setAccessible(true);
	System.out.println(f04.getName()+":"+f04.get(stu02));
}
}
	

}


举报

相关推荐

0 条评论