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 反射定义 一般情况下,需要一个功能的前提是遇到了某个问题,这里先列举一些问题,然后再通过反射是如何解决了这些问题,来引出反射的定义. 普通开发人员工作中最常见的问题:需要生 ...
随机推荐
- LeetCode:不用加号的加法(位运算)
解题思路:位运算,只能用位运算符.a.b同号比较好处理.主要是异号的情况,考虑 a>0,b<0,因为 a,b的绝对值都不会超过2^32,因此取模数为2^32.根据同余方程可知 (a+b)% ...
- 阿里云+智能ai+gpt
1.阿里 百度 腾讯分词 知识库. 阿里云(项目具体的费用预算展示,实际功能核算.) 向量智库 https://developer.aliyun.com/article/1234278?spm ...
- pycharm插件离线安装
给不能联网的电脑或者不能访问外网的云桌面安装pycharm插件,需要离线安装 首先在能访问网络的电脑上打开插件主页,如下: 下载插件安装文件
- Web测试基本思路:UI测试、功能测试和兼容性测试
关于网站测试的基本思路,希望对测试小白有所帮助. 一.UI测试 用户界面测试主要是拿待测网页和设计稿进行对比,主要主要以下4点: 1.注重细节: 这点最基本,就是对比是细心.细心再细心. 2.主要整体 ...
- Python——第五章:shutil模块
复制文件 把dir1的文件a.txt 移动到dir2内 import shutil shutil.move("dir1/a.txt", "dir2") 复制两个 ...
- 开心自走棋:使用 Laf 云开发支撑数百万玩家
先介绍一下开心自走棋 开心自走棋是一款剑与魔法的烧脑自走棋游戏.以著名的魔幻世界观为蓝本,采用了轻松可爱的画面风格,精致细腻的动画和特效来还原魔兽之战. 现在市面上自走棋游戏多是 PvP 玩法为主,而 ...
- C#中对比两个对象是否相等最佳实践,IEquatable和IEqualityComparer的差异
前言 IEquatable<T> IEqualityComparer<T> 后言 参考 前言 IEquatable<T> 和 IEqualityComparer&l ...
- AIGC的阿克琉斯之踵
摘要:现在,越来越多的企业和个人使用AIGC生成文章.图片.音乐甚至视频等内容,AIGC已经成为一种必备的工具.在游戏和原画师行业,甚至已经出现了第一批因为AI而失业的人. 本文分享自华为云社区< ...
- 案例集锦|科技赋能,华为云GaussDB助千行百业数字化转型
当下,全社会驶入数字化转型快车道,以科技赋能.智慧转型为主旨的数字生态推动着千行百业的变革.数据库作为企业核心数据底座,华为云提供了安全可靠的云原生底座和一站式上云解决方案.其中华为云GaussDB覆 ...
- 利用Appuploader上架IPA步骤
Appuploader可以辅助在Windows.linux或mac系统直接申请iOS证书p12,及上传ipa到App Store.方便在没有苹果电脑情况下上架IPA操作. 一.下载安装iOS上架辅 ...