Java反射、枚举以及lambda表达式

news/2024/11/24 20:15:06/

1 反射

定义:Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到,那么我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

1.1 与反射相关的类

类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量/类的属性
Method类代表类的方法
Constructor类代表类的构造方法

1.2代码

package refelectdemo;
class Student{//私有属性nameprivate String name="bit";//共有属性agepublic int age=18;//不带参数的构造方法public Student(){System.out.println("Student()");}private Student(String name,int age){this.name=name;this.age=age;System.out.println("Student(String,name)");}private void eat(){System.out.println("i am eat");}public void sleep(){System.out.println("i am pig");}private void function(String str){System.out.println(str);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class Test {public static void main1(String[] args) throws ClassNotFoundException {//1.获取一个Class对象Class<?> c1=Class.forName("refelectdemo.Student");Class<?> c2=Student.class;//类名.class对象Student student=new Student();Class<?> c3=student.getClass();System.out.println(c1.equals(c2));System.out.println(c1.equals(c3));System.out.println(c2.equals(c3));//Class对象只有一个}
}
package refelectdemo;import com.sun.xml.internal.ws.api.ha.StickyFeature;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ReflectClassDemo {//创建对象public static void reflectNewInstance(){try{Class<?> c1=Class.forName("refelectdemo.Student");Student student=(Student)c1.newInstance();System.out.println(student);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}//反射私有的构造方法,屏蔽内容为获得公有的构造方法public static void reflectPrivateConstructor(){try{Class<?> c1=Class.forName("refelectdemo.Student");//Constructor<Student> constructor=(Constructor<Student>) c1.getDeclaredConstructor(String.class,int.class);Constructor<?> constructor=c1.getDeclaredConstructor(String.class,int.class);//私有的本身是封装的,constructor.setAccessible(true);Student student=(Student) constructor.newInstance("bit",18);System.out.println(student);}catch (ClassNotFoundException e){} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}//反射所有的,用私有属性来举例public static void reflectPrivateField(){try{Class<?> c1=Class.forName("refelectdemo.Student");Student student=(Student)c1.newInstance();Field field=c1.getDeclaredField("name");field.setAccessible(true);field.set(student,"zhangsan");System.out.println(student);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}//反射私有方法public static void reflectPrivateMethod(){try{Class<?> c1=Class.forName("refelectdemo.Student");Student student=(Student)c1.newInstance();//方法名称   方法的参数Method method=c1.getDeclaredMethod("function",String.class);method.setAccessible(true);method.invoke(student,"我是function的参数");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}public static void main(String[] args) {//reflectNewInstance();//reflectPrivateConstructor();//reflectPrivateField();reflectPrivateMethod();}
}

2 枚举

Enum类的常用方法

方法名称描述
values()以数组形式返回枚举类型的所有成员
ordinal()获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序

1.1 代码

package enumdemo;
//自己写的枚举类,都默认继承于Enum
public enum TestEnum {RED("红色",1),GREEN("绿色",2),BLACK("黑色",3);//枚举对象public String color;public int ordinal;//枚举的构造方法默认是私有的private TestEnum(String color, int ordinal) {this.color = color;this.ordinal = ordinal;}public static void main(String[] args) {TestEnum[] array =TestEnum.values();for (int i=0;i<array.length;i++){System.out.println(array[i]+" "+array[i].ordinal());}System.out.println("============");TestEnum test=TestEnum.valueOf("RED");System.out.println(test);System.out.println("=================");System.out.println(RED.compareTo(BLACK));}public static void main1(String[] args) {TestEnum testEnum2=TestEnum.BLACK;switch (testEnum2){case RED:System.out.println("red");break;case GREEN:System.out.println("green");break;case BLACK:System.out.println("black");break;default:break;}}
}

1.2 枚举的优缺点

  • 优点:枚举常量更简单安全;枚举具有内置方法,代码更优雅
  • 缺点:不可继承,无法扩展
package enumdemo;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class TestReflectEnum {public static void func(){try{Class<?> c=Class.forName("enumdemo.TestEnum");Constructor<?> constructor=c.getDeclaredConstructor(String.class,int.class,String.class,int.class);constructor.setAccessible(true);TestEnum testEnum=(TestEnum)constructor.newInstance("草原色",89);System.out.println(testEnum);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}public static void main(String[] args) {func();}
}

3 Lambda表达式

缺点:不易读

优点:代码量少

package lambda;
//函数接口,有且仅有一个抽象方法//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn{void test();}//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn{void test(int a);
}//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn{void test(int a,int b);
}//有返回值无参数
@FunctionalInterface
interface NoParameterReturn{int test();}//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn{void test(int a);
}//有返回值多个参数
@FunctionalInterface
interface MoreParameterReturn{int test(int a, int b);
}public class Test1 {public static void main(String[] args) {NoParameterReturn noParameterReturn=()->{return 10;};NoParameterReturn noParameterReturn1=()->10;int ret=noParameterReturn1.test();System.out.println(ret);}public static void main2(String[] args) {NoParameterNoReturn noParameterNoReturn=()->{System.out.println("haha");};noParameterNoReturn.test();//一条语句花括号省略OneParameterNoReturn oneParameterNoReturn=a-> System.out.println(a);OneParameterNoReturn oneParameterNoReturn2=(a)-> {System.out.println(a);};oneParameterNoReturn.test(10);MoreParameterNoReturn moreParameterNoReturn=(a,b)->{System.out.println(a+b);};//如果方法体只有一条语句,花括号可以省略MoreParameterNoReturn moreParameterNoReturn1=(a,b)-> System.out.println(a+b);moreParameterNoReturn.test(1,2);}public static void main1(String[] args) {MoreParameterReturn moreParameterReturn=new MoreParameterReturn(){@Overridepublic int test(int a, int b) {return a+b;}};MoreParameterReturn moreParameterReturn2=(int a,int b)->{return a+b;};}
}


http://www.ppmy.cn/news/721159.html

相关文章

台式计算机网卡安装步骤图解,台式机怎样安装网卡驱动,详细教您电脑安装网卡驱动...

我们的网络总是其名的出现各种问题&#xff0c;这时我们可能会考虑换个新版的网卡驱动来用。而台式都没有无线网卡的&#xff0c;所以我们只能安装网卡驱动了。那么怎么去操作安装呢&#xff0c;有些朋友有可能还不知道网卡驱动如何安装&#xff0c;下面&#xff0c;小编就给大…

MySql基础知识及数据查询

目录 第一章 数据库概述 1.为什么要学习数据库&#xff1f; 2.数据库的相关概念 3.ORM(Object Relational Mapping)思想 4.表与表的记录之间存在哪些关联关系 第二章 基本的SELECT语句 1.SQL的分类 2. SQL基本规则 3.导入现有的数据表、表的数据 4.最基本的…

mapbox 样式

mapbox 样式 styles1. 矢量瓦片加载(VectorSource)2. 栅格瓦片加载(RasterSource)3. 改变地图语种(Language)4. 隐藏显示图层(Visibility)5. 地图上加载图片(ImageSource)6. 时间推移效果 styles 1. 矢量瓦片加载(VectorSource) VectorSourceActivity style.addSource(new Ve…

初入灵狐

不想呆在学校实操&#xff0c;交了申请表&#xff0c;跑到先前面试好的广州市灵狐软件公司见习&#xff0c;想提前接触企业&#xff0c;好为将来就业做准备。 直至今天&#xff0c;到去灵狐上班应该有5天了&#xff0c;与其说上班&#xff0c;不如说去受培训&#xff0c;每天早…

降本增效这九个月,爱奇艺从“穿越火线”,到“冷静增长”

在互联网行业一致宣称降本、提质、增效的小周期里&#xff0c;爱奇艺已经把这个趋势彻底吃透&#xff0c;展现出成熟的一面。 11月22日美股盘前&#xff0c;爱奇艺发布了2022年第三季度业绩&#xff0c;连续三个季度运营盈利&#xff0c;而且当季净增会员数超千万&#xff0c;…

《穿越火线》几次体验良好的游戏优化方案

文章目录 介绍救世主模式终结者模式30人生化模式挑战模式英雄级武器源武器英雄级武器皮肤英雄级武器游戏玩偶英雄级武器万化包、光效英雄级武器强化英雄级武器音效卡免费获取挑战强化武器戒指击杀效果个人竞技击杀效果人机训练模式交易所火线币快速加入跳跳乐爆头战HS间谍模式地…

前端vue入门(纯代码)20

总以为自己还很年轻&#xff0c;却忽略了岁月的脚步&#xff0c;当身边的一道道风景变成了回忆&#xff0c;才忽然发现&#xff0c;风景依然在&#xff0c;而人已非少年。&#xff01;&#xff01;&#xff01; 【22.求和案例--纯Vue版本】 太简单了&#xff0c;直接上代码案…

对比学习论文-系列4

文章目录 MedCLIP: Contrastive Learning from Unpaired Medical Images and Text目标问题来源模型架构 Supervised Prototypical Contrastive Learning for Emotion Recognition in ConversationPrototypical Contrastive LearningCurriculum Strategy&#xff1a; KECP: Know…