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的更多相关文章

  1. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  2. Java基础——反射

    今天学到Java基础中的反反射.依照我学习后的个人理解呢,反射就是一套获取类.属性.方法等的工具吧.(其实,感觉学完反射后,有点像喝凉水,解渴但确实我也没体会出它有什么味道,我可能没有学到精髓吧.自己 ...

  3. Java基础反射(二)

    原文地址http://blog.csdn.net/sinat_38259539/article/details/71799078 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Cla ...

  4. java基础(反射,注解,多线程,juc)

    JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...

  5. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  6. JAVA基础-反射机制

    什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...

  7. java基础-反射(细节)

    java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...

  8. Java基础—反射(转载)

    转载自: JAVA反射与注解 JAVA反射 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射机制是什么 反射 ...

  9. java基础——反射机制

    反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  10. Java基础—反射与代理(新手向)

    第1章 反射与代理 1.1 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...

随机推荐

  1. 27、Type关键字

    1.是什么? type是go语法里额重要而且常用的关键字,type绝不只是对应于C/C++中的typeof.搞清楚type的使用,就容易理解Go语言中的核心概念struct.interface.函数等 ...

  2. 9、For语句

    1.for循环概念 程序的流程控制结构一共有三种: 顺序结构,选择结构,循环结构. 顺序结构:代码从上向下逐行的执行 选择结构:条件满足,某些代码才会被执行.0-1次 if语句,switch语句 循环 ...

  3. SpringSecurity入门(SSM版)

    1. 简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Sp ...

  4. 10 个免费的 AI 图片生成工具分享

    原文: https://openaigptguide.com/ai-picture-generator/ 在人工智能(AI)图像生成技术的推动下,各类AI图片生成网站如雨后春笋般涌现,为我们的日常生活 ...

  5. 使用jvm工具排查系统问题

    java-jvm-tool Jstatd 远程连接(推荐) 不用重启项目 远程机配置 [demo@localhost jvmtest]$ vi jstatd.all.policy# 内容grant c ...

  6. 【笔记整理】[案例]爱词霸翻译post请求

    import json if __name__ == '__main__': import requests resp = requests.post( url="http://ifanyi ...

  7. MinIO客户端之stat

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc stat 获取指定桶或者对象的信息,包含对象的元数据. 指定桶bkt1,查看信息,命令如下: ./mc st ...

  8. 微软成为PostgreSQL主要贡献者

    微软成为PostgreSQL主要贡献者 微软对PostgreSQL贡献的很多新功能都来自于客户在使用微软Azure上的PostgreSQL管理实例数据库,所以这些新功能都来自于真实的客户需求 微软对P ...

  9. 5s!用浏览器打造一个开箱即用的Linux系统

    做为Linux系统管理员.或者是系统运维工程师,肯定会在工作遇到这样的需求:需要开发环境.测试环境.准生产环境等等环境,有时候建一个环境费时间不说,还容易出各种错误,好不容易建好了,可能还用不了几天. ...

  10. 用Linux搭建网站(LAMP)

    安装环境 演示服务器版本为CentOS 8 安装apache 下载apache yum install httpd httpd-devel 启动apache服务器 systemctl start ht ...