java基础-反射-day15
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,
都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
1. 案例引入
点外卖 有多种支付方式
微信支付 支付宝支付 。。。
接口
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:46
* @Description: com.msb.test01
* @version: 1.0
*/
public interface Pay {
void payOnline();
}
支付宝支付
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:48
* @Description: com.msb.test01
* @version: 1.0
*/
public class AliPay implements Pay {
@Override
public void payOnline() {
System.out.println("Ali pay");
}
}
微信支付
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:47
* @Description: com.msb.test01
* @version: 1.0
*/
public class WeChart implements Pay {
@Override
public void payOnline() {
System.out.println("We Chart pay");
}
}
银行卡支付
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:49
* @Description: com.msb.test01
* @version: 1.0
*/
public class BankPay implements Pay {
@Override
public void payOnline() {
System.out.println("bank card pay");
}
}
实现支付的方式1
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:50
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test01 {
public static void main(String[] args) {
String str = "wechart";
if ("wechart".equals(str)){
pay(new WeChart());
}
}
public static void pay(WeChart wc){
wc.payOnline();
}
public static void pay(AliPay ap){
ap.payOnline();
}
public static void pay(BankPay bp){
bp.payOnline();
}
}
实现支付的方式2 多态
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:50
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test02 {
public static void main(String[] args) {
String str = "wechart";
if ("wechart".equals(str)){
pay(new WeChart());
}
}
public static void pay(Pay p){
p.payOnline();
}
}
实现支付的方式3 反射
package com.msb.test01;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 20:58
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test03 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
String str = "com.msb.test01.AliPay";
Class clazz = Class.forName(str);
Object o = clazz.newInstance();
Method payOnline = clazz.getMethod("payOnline");
payOnline.invoke(o);
}
}
2. Class 的理解
Class 是对所有类的后抽象 所有的类 例如 Person Student 都只是Class 的一个实例而已
3. 反射的详细使用
获取 类的字节码
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:30
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test04 {
public static void main(String[] args) throws ClassNotFoundException {
Person p = new Person();
Class c1 = p.getClass();
System.out.println(c1);
Class c2 = Person.class;
System.out.println(c2);
Class c3 = Class.forName("com.msb.test01.Person");
System.out.println(c3); //最常用
ClassLoader classLoader = Test04.class.getClassLoader();
Class c4 = classLoader.loadClass("com.msb.test01.Person");
System.out.println(c4);
//字节码只加载一次 所以 都是同一个 字节码 c1 == c2
}
}
4. Class 类都有哪些实例
Class类的具体的实例:
(1)类:外部类,内部类
(2)接口
(3)注解
(4)数组
(5)基本数据类型
(6)void
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:36
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test05 {
public static void main(String[] args) {
Class c1 = Person.class;
Class c2 = Comparable.class;
Class c3 = Override.class;
int[] arr1 = {1,2,3};
Class c4 = arr1.getClass();
Class c6 = int.class;
Class c7 = void.class;
}
}
5. 详细使用
注解
package com.msb.test01;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:41
* @Description: com.msb.test01
* @version: 1.0
*/
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
String value();
}
接口
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:43
* @Description: com.msb.test01
* @version: 1.0
*/
public interface MyInterface {
void myMethod();
}
父类
package com.msb.test01;
import java.io.Serializable;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:24
* @Description: com.msb.test01
* @version: 1.0
*/
public class Person implements Serializable {
private int age;
public String name;
public void eat(){
System.out.println("eating");
}
public void sleep(){
System.out.println("Sleeping");
}
}
子类
package com.msb.test01;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:25
* @Description: com.msb.test01
* @version: 1.0
*/
@MyAnno(value="hello")
public class Student extends Person implements MyInterface {
private int sno;
double height;
protected double weight;
public double score;
@MyAnno(value="himethod")
public String ShowInfo(){
return "我是 一名三好学生";
}
private void work(){
System.out.println("Working");
}
public Student(){
System.out.println("空参 构造器");
}
public Student(int sno){
this.sno = sno;
}
public Student(int sno, double weight){
this.sno = sno;
this.weight = weight;
}
protected Student(int sno,double height,double weight){
this.sno = sno;
}
@Override
public void myMethod() {
System.out.println("Student override myMethod!!!");
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", height=" + height +
", weight=" + weight +
", score=" + score +
'}';
}
}
package com.msb.test01;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 21:49
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test06 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class cls = Student.class;
// 构造器的获取
Constructor[] constructors = cls.getConstructors();//只能获取当前运行时类的被public修饰的构造器
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor constructor1 = cls.getConstructor();
System.out.println(constructor1);//空参构造器
Constructor constructor = cls.getDeclaredConstructor(double.class, double.class);
System.out.println(constructor);//两个double参数的构造器
Constructor declaredConstructor = cls.getDeclaredConstructor(int.class);
System.out.println(declaredConstructor);//private修改的构造器
Object o1 = constructor1.newInstance();
System.out.println(o1);//创建对象
Object o2 = constructor.newInstance(180.0, 170.1);
System.out.println(o2);
}
}
6. 获取属性
package com.msb.test01;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 22:01
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test07 {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
Class cls = Student.class;
Field[] fields = cls.getFields();//获取运行时类和父类中被public修饰的属性
for (Field field : fields) {
System.out.println(field);
}
Field[] declaredFields = cls.getDeclaredFields();
System.out.println(declaredFields);//获取运行时类中的所有属性
Field score = cls.getDeclaredField("score");
System.out.println(score);
Field sno = cls.getDeclaredField("sno");
System.out.println(sno);
//修饰符 modifiers
int modifiers = sno.getModifiers();
System.out.println(modifiers);
System.out.println(Modifier.toString(modifiers));
//获取filed的数据类型
Class type = sno.getType();
System.out.println(type.getName());
String name = sno.getName();
System.out.println(name);
Field score1 = cls.getField("score");
Object o = cls.newInstance();
score1.set(o, 98);
System.out.println(o);
}
}
7. 获取方法
package com.msb.test01;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 22:10
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test08 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
Class cls = Student.class;
Method[] methods = cls.getMethods();//取运行时类的方法还有所有父类中的方法(被public修饰)
for (Method method : methods) {
System.out.println(method);
}
Method[] declaredMethods = cls.getDeclaredMethods();//获取运行时类中的所有方法
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
Method showInfo = cls.getMethod("ShowInfo");
System.out.println(showInfo);
Method work = cls.getDeclaredMethod("work", int.class);
System.out.println(work);
String name = work.getName();//方法的名字
System.out.println(name);
int modifiers = work.getModifiers();//方法的修饰符
System.out.println(Modifier.toString(modifiers));
Class<?> returnType = work.getReturnType();
System.out.println(returnType);
Class<?>[] parameterTypes = work.getParameterTypes();//方法的参数类型
for (Class<?> parameterType : parameterTypes) {
System.out.println(parameterType);
}
Object o = cls.newInstance();
Method myMethod = cls.getMethod("myMethod");
myMethod.invoke(o);
}
}
8 获取类的 接口 注解 所在的包
package com.msb.test01;
import java.lang.annotation.Annotation;
/**
* @Auther: jack.chen
* @Date: 2023/10/9 - 10 - 09 - 22:23
* @Description: com.msb.test01
* @version: 1.0
*/
public class Test09 {
public static void main(String[] args) {
Class cls = Student.class;
Class[] interfaces = cls.getInterfaces();
for (Class anInterface : interfaces) {
System.out.println(anInterface);
}
Class superclass = cls.getSuperclass();
System.out.println(superclass);
Class[] interfaces1 = superclass.getInterfaces();
for (Class c : interfaces1) {
System.out.println(c);
}
Package aPackage = cls.getPackage();
System.out.println(aPackage);
System.out.println(aPackage.getName());
Annotation[] annotations = cls.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
}
}
9. 思考
反射是否破坏了 封装
private proteted属性方法外部还是能访问到
java基础-反射-day15的更多相关文章
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- Java基础——反射
今天学到Java基础中的反反射.依照我学习后的个人理解呢,反射就是一套获取类.属性.方法等的工具吧.(其实,感觉学完反射后,有点像喝凉水,解渴但确实我也没体会出它有什么味道,我可能没有学到精髓吧.自己 ...
- Java基础反射(二)
原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...
- java基础(反射,注解,多线程,juc)
JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...
- [java 基础]反射入门
原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...
- JAVA基础-反射机制
什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...
- java基础-反射(细节)
java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...
- Java基础—反射(转载)
转载自: JAVA反射与注解 JAVA反射 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射机制是什么 反射 ...
- java基础——反射机制
反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- Java基础—反射与代理(新手向)
第1章 反射与代理 1.1 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...
随机推荐
- 华企盾DSC防泄密软件造成VS启动报目录错误
解决方法:找到安装路径下的Privateregistry.bin文件解密即可
- 【UniApp】-uni-app-动态计算字体大小(苹果计算器)
前言 本文主要介绍uni-app中动态计算字体大小的方法 原因呢就是在上一篇文章当中我发现输入的内容已经超过了展示区域 于是我就想到了动态计算字体大小的方法,这样就可以保证输入的内容不会超过展示区域 ...
- MySQL部署后配置
授权root用户登录 #仅本地登录,修改密码用 alter user root@'localhost' identified with mysql_native_password by'******* ...
- Rabin-Karp 字符串查找算法
和一般的比较字符串的方式不同,Rabin-Karp 查找算法通过对子字符串进行 hash,如果在原有字符串中找到了 hash 值相同的字符串,那么继续比较是否是需要查找的字串,一般来讲,如果 hash ...
- JVM优化:如何进行JVM调优,JVM调优参数有哪些
Java虚拟机(JVM)是Java应用运行的核心环境.JVM的性能优化对于提高应用性能.减少资源消耗和提升系统稳定性至关重要.本文将深入探讨JVM的调优方法和相关参数,以帮助开发者和系统管理员有效地优 ...
- Spring源码学习笔记7——Spring bean的初始化
一丶前言 上篇中我们了解了Spring bean的实例化--存在方法覆盖的使用CGLIB动态代理生成子类,反之反射调用构造函数.实例化后bean中的字段都是默认值,接下来就是对bean的属性进行填充, ...
- 限制左键拖拽图片阴影vue
<template> <div> <img ref="image" :src="imageUrl" :style="im ...
- Quartz.Net系列(八):Trigger之CalendarIntervalScheduleBuilder详解
所有方法图 CalendarIntervalScheduleBuilder方法 在SimpleScheduleBuilder基础上实现了日.周.月.年 WithInterval:指定要生成触发器的时间 ...
- windows环境下如何优雅搭建ftp服务?
目录 0. 前言 1.ftp简介 2.下载Apache FTPServer 3.下载并解压压缩包 4.修改配置文件 4.1 修改users.properties配置文件 4.2 修改ftpd-typi ...
- C# 添加OLE到PPT幻灯片
本文介绍通过C#程序代码来添加OLE对象到PPT幻灯片的方法.这里以将Excel文档为对象插入到PPT幻灯片中的指定位置:添加时,将Excel中的单元格范围保存为图片,将图片以嵌入的方式添加到幻灯片, ...