栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

反射的运用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

反射的运用

铁子们今天分享的是反射的运用

老规矩学习之前先看思维导图

目录

一:反射

二:类类

三:反射实例化

​编辑

四:反射动态方法调用

五:反射读取属性


一:反射

什么是反射呢

1,定义:反射是JAVA语言中一种机制,通过该机制可以动态的实例化对象,读取属性,以及调用方法

2.作用

 框架是基于反射+设计模式组合的一个半成品

所以反射可以用于组建框架。

为什么要学反射?

java的反射机制就是增加程序的灵活性,避免将代码写的太死,使其更灵活

二:类类

什么是类类?

举个通俗易懂的例子:比如老六是狗类的实例化对象,张三是学生类的实例化对象、而狗类和学生类以及其他所有的类又是类类的实例 所以说类类就是其他类的上一级,其他类就是类类的实例

2.类类的三种获取方式

                ①类.class

                ②类实例.getClass()

                ③Class.forName("类的全路径名");

案例 如下:

)package com.tsq.reflect;
 

public class Demo1 {
 public static void main(String[] args) throws Exception {
  
//  类.class
  Class clazz = Student.class;
  
//  类实例.getClass()
  Student stu = new Student();
  Class clazz2 = stu.getClass();
  
//  Class.forName("类的全路径名")
  Class.forName("com.zhw.reflect.Student");
 }
}

效果如下

 

三:反射实例化

1、getConstructor

2、getDeclaredConstructor

3、newInstance

package com.tsq.reflect;

import java.lang.reflect.Constructor;


public class Deml2 {
public static void main(String[] args) throws Exception, IllegalAccessException {
	Student stu1 = new Student();
	Student stu2=new Student("s001");
	Student stu3 = new Student("s001","张三");
	
	//获取类类
	Class clz1 = stu1.getClass();
//	默认就是调用无参共有的
//	1.无参数 共有的方法
	Student stu4 = clz1.newInstance();
//	2.有参共有构造方法
//	拿到构造器对象3个2个1个n个参数~~>拿到一个String的构造器对象
	Constructor c1 = clz1.getConstructor(String.class); 
	Student stu5 = c1.newInstance("s001");
//	3有多个参数共有的构造方法拿到那两个参数的构造器对象
	Constructor c2 = clz1.getConstructor(String.class);
	Student stu6 = c2.newInstance("s001","李四");

//	4私有的构造方法
//	getconstructor只能够获取共有的构造方法 要获取私有的构造  器 
	Constructor c3 = clz1.getDeclaredConstructor(Integer.class);
	c3.setAccessible(true);  
	Student stu7 = c3.newInstance(18);

}
}
 

效果如下

 

 

四:反射动态方法调用

1、getMethod

2、getDeclaredMethod

package com.tsq.reflect;

import java.lang.reflect.Method;


public class deml3 {
public static void main(String[] args) throws Exception{
	
//	1先拿到类类
	Classclz= Student.class;
	//name:方法名 parametypes :方法调用的实参
	Method m1 = clz.getMethod("hello");
//	3.调用对应方法
//	第一个参数 那个类实力 第二个参数 :方法 顶用实的实参
	Object invoke = m1.invoke(clz.newInstance());
	System.out.println(invoke);
	//1个有参 共有方法
	Method m2 = clz.getMethod("hello", String.class);
	Object invoke2 = m2.invoke(clz.newInstance(), "张三");
	System.out.println(invoke2);
	//调用私有方法
	Method m3 = clz.getDeclaredMethod("add", Integer.class,Integer.class);
	m3.setAccessible(true);
	Object invoke3 = m3.invoke(clz.newInstance(), 5,5);
System.out.println(invoke3);

}
}

效果如下

 

五:反射读取属性

1、getDeclaredField

2、getDeclaredFields

package com.tsq.reflect;

import java.lang.reflect.Field;

public class Demo4 {
public static void main(String[] args) throws Exception {
	Student stu = new Student("s003","张三");
	stu.age=20;
//	需求 拿到学生所有属性
	System.out.println("agd:"+stu.age);
	System.out.println("sname"+stu.getSname());
	System.out.println("sid"+stu.getSid());

	Class clz = stu.getClass();
	//当前类所有属性对象
	Field[] fields = clz.getDeclaredFields();
	System.out.println(fields.length);
	//循环中的代表每一个属性
	for (Field f : fields) {
		//打开权限
		f.setAccessible(true);
		//通过属性对象拿到名称
		System.out.println(f.getName());
		//、拿到当前属性对象名称
		System.out.println(	f.get(stu));
	
	}
	
}
}

效果如下

 

好了本次分享到此结束了我们下次见面拜拜 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979279.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号