wordpress网站响应时间,钱宝网站怎么做任务,个人网站效果,江苏工程建设信息官方网站文章目录 反射反射的定义#xff1a;反射相关的类#xff1a;反射相关的方法#xff1a;反射示例#xff1a;获取Class类对象创建指定类的对象反射私有属性#xff1a;反射私有方法#xff1a;反射私有的构造方法 枚举枚举的意义枚举类的实现枚举类的使用#xff1a;Enu… 文章目录 反射反射的定义反射相关的类反射相关的方法反射示例获取Class类对象创建指定类的对象反射私有属性反射私有方法反射私有的构造方法 枚举枚举的意义枚举类的实现枚举类的使用Enum类中常用的四个方法枚举与反射 lambda表达式函数式接口lambda表达式的语法lambda表达式的使用关于lambda表达式语法精简的问题java集合类与lambda表达式的使用问题 变量捕获 反射
反射的定义
java的反射机制是指在程序的运行状态中对于任意一个类可以获取这个类的全部信息包括类加载器后面会学到构造方法成员属性成员方法等。对于任意一个对象我们也能够调用其属性与方法进行修改信息这种动态地获取信息与动态地调用对象的机制我们称为反射机制。
反射相关的类 反射相关的方法
在Class类中即包含了获取类加载器创建指定类对象获取构造方法属性成员方法的方法如下图所示 反射示例
获取Class类对象
此处的Class并不是指表示类名的关键字而是指Class这个具体的类 因为Class类的构造方法是私有方法所以不能够直接实例化对象。 我们需要获取Class类对象有三种方式 第一种调用对象的getClass方法 Student student new Student();//getClass方法也是用c/c代码实现的ClassStudent c1 (ClassStudent) student.getClass();第二种直接调用类名的class属性 但是我们并没有在Student中定义class属性//这说明每一个方法都有一个默认的class属性Class c2 Student.class;第三种通过class对象的ForName方法来获取 Class c3 null ;c3 Class.forName(reflectDemo.Student);判断这三个class对象是不是同一个对象。 System.out.println(c1 c2);System.out.println(c1c3);System.out.println(c2c3);结果表明我们通过三种方式创建的三个Class对象实际上是一个 注
实际上是因为任何一个类在JVM中只会被加载一次所以其所对应的Class对象也
只会被创建一次。如果通过两个不同的类来创建Class对象则这两个Class对象不一样。Class c2 Dog.class;结果为此时c2与c1,c3均不相同。
创建指定类的对象
使用的Student类
public 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 static void reflectNewInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class c3 null ;c3 Class.forName(reflectDemo.Student);//要通过c3对象来调用实例化对象的方法Student student1 (Student) c3.newInstance();System.out.println(student1);}调用此方法。 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {//通过class对象创建一个学生对象reflectNewInstance();}反射私有属性
//简写了
public class Student {//私有属性nameprivate String name bit; //公有属性agepublic int age 18;
反射私有属性的方法
public static void reflectPrivateField(){Class c3 null ;try {c3 Class.forName(reflectDemo.Student);Field field c3.getDeclaredField(name);//我们可以修改这个私有属性的值field.setAccessible(true);//还需要有一个Student对象Student student3 (Student)c3.newInstance();field.set(student3,张三);System.out.println(student3);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}
}public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {reflectPrivateField();} 反射私有方法
public class Student {
private void eat(String s){System.out.println(s);}}public static void reflectPrivateMethod(){Class c4 null;try {c4 Class.forName(reflectDemo.Student);//在有参数时一定要加上参数类型的classMethod method c4.getDeclaredMethod(eat,String.class);Student student4 (Student) c4.newInstance();method.setAccessible(true);method.invoke(student4, i am eat);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
}public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {reflectPrivateMethod();}反射私有的构造方法
public class Student {private Student(String name,int age) {this.name name;this.age age;System.out.println(Student(String,name));}
}public static void reflectPrivateConstructor(){Class c3 null ;try {c3 Class.forName(reflectDemo.Student);//调用getConstructor方法参数为ConstructorStudent constructor c3.getDeclaredConstructor(String.class,int.class);//在获取了构造方法之后呢constructor.setAccessible(true);//直接调用此构造方法为对象赋值Student student2 constructor.newInstance(张三,15);System.out.println(student2);} 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) throws ClassNotFoundException, InstantiationException, IllegalAccessException {reflectPrivateConstructor();}枚举
枚举的意义
枚举是将一组常量组织起来即将这一组常量赋予特殊的意义用特殊的类型表示它们。 所用的场景为错误状态码消息类型颜色的划分状态机等等…
枚举类的实现
枚举类有自己特定的关键字即enum, 所有我们自己定义的枚举类均继承于java提供的Enum类。
枚举类的使用
在类中定义枚举成员
public enum Myenum {//在自定义的枚举类中定义一些成员Red,Yellow,Blue,Green;
}获取枚举成员
public enum Myenum {//在自定义的枚举类中定义一些成员Red,Yellow,Blue,Green;public static void main(String[] args) {
//我们可以通过枚举类名来直接获取枚举成员而不需要创建枚举类的对象。System.out.println(Myenum.Blue);}
}关于枚举类的构造方法 注因为枚举类型的构造方法是私有的所以不能够在其他类中进行 创建对象但是在枚举类中也不能够创建枚举类对象 枚举类的使用意义并不在于它的对象而在于它的枚举成员其枚举成员可以直接通过类名调用。
Enum类中常用的四个方法 因为我们定义的枚举类继承于Enum类所以Enum类中的所有方法均可使用
public static void main(String[] args) {//关于枚举类中方法的使用//1. values方法用于获取枚举类中所有的枚举成员。//问题在Enum类中并没有values方法那么这个方法是从哪里来的Myenum[] myenums Myenum.values();for (Myenum myenum2: myenums) {//在获取了每个枚举成员后开始进行每个枚举成员的索引位// 2. 调用ordinal方法System.out.println( myenum2 myenum2.ordinal());}// 3. valueof方法将普通的字符串转换成枚举实例// System.out.println(Myenum.valueOf(GREEN));//意思为如果在枚举类中有此枚举成员则会返回对应的枚举成员如果没有则报异常System.out.println(Red);// 4. 第四个方法compareTo方法//在Enum类中实现了comparable接口实现了compareTo方法用于比较两个//枚举成员的索引位置。System.out.println(Red.compareTo(Blue));}枚举与反射
我们不能够通过枚举的构造方法来实例化枚举类对象那么能否通过反射机制来创建枚举类对象呢 实际上是不行的。 Enum类中的构造方法
public static void main(String[] args) {//尝试通过反射进行实例化enum对象Class? c1 null;try {//要注意当父类的构造方法未调用时子类的构造方法是不能被调用的c1 Class.forName(enumdemo.Myenum);//枚举类不能够通过反射类进行创建。//在指定的类的具有父类时也应该加上父类形参类型的.class属性Constructor constructor c1.getDeclaredConstructor(String.class,int.class,int.class,String.class);//获取了相应的构造方法后constructor.setAccessible(true);Myenum myenum (Myenum) constructor.newInstance(2,hong);} 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();}}运行结果
lambda表达式
函数式接口
如果一个接口中只有一个抽象方法则此接口称为函数式接口。 lambda表达式可代替函数式接口的实现直接将lambda表达式赋给接口类型的变量。
lambda表达式的语法
如 (parameters) - expression 或 (parameters) -{ statements; } . paramaters类似方法中的形参列表这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明 也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。 2. -可理解为“被用于”的意思 3. 方法体可以是表达式也可以代码块是函数式接口里方法的实现。代码块可返回一个值或者什么都不反 回这里的代码块块等同于方法的方法体。如果是表达式也可以返回一个值或者什么都不返回。
lambda表达式的使用
interface NoParameterNoReturn{//无参且无返回值void test();
}
interface OneParameterNoReturn{//有一个参数无返回值void test(int a);
}
interface MultipleParameterNoReturn{//有多个参数无返回值void test(int a,int b);
}
interface NoParameterReturn{//无参且有返回值int test();
}
interface OneParameterReturn{//有一个参数有返回值int test(int a);
}
interface MultipleParameterReturn{//有多个参数有返回值int test(int a,int b);
}public static void main(String[] args) {//Lambda表达式可用于实现只有一个抽象方法的接口。//先实现无返回值无参数的接口NoParameterNoReturn noParameterNoReturn1 new NoParameterNoReturn() {Overridepublic void test() {System.out.println(调用无返回值无参数方法);}};//直接调用方法noParameterNoReturn1.test();//我们采用lambda表达式直接赋给noParameterNoReturns变量NoParameterNoReturn noParameterNoReturn2 ()-{ System.out.println(调用无返回值无参数方法);};noParameterNoReturn2.test();}此两种方式效果相同。 public static void main(String[] args) {//调用一个无参有返回值的方法NoParameterReturn noParameterReturn ()-10; //可以不写return 关键字直接写数值或语句System.out.println(noParameterReturn.test());}关于lambda表达式语法精简的问题
参数类型可以省略如果需要省略每个参数的类型都要省略。参数的小括号里面只有一个参数那么小括号可以省略如果方法体当中只有一句代码那么大括号可以省略如果方法体中只有一条语句且是return语句那么大括号可以省略且去掉return关键字。
java集合类与lambda表达式的使用问题 public static void main(String[] args) {//举例ArrayList中的forEach语句ArrayListInteger arrayList new ArrayList();arrayList.add(10);arrayList.add(20);arrayList.add(15);//遍历数组可以用迭代器foreach语句等也可以采用arrayList本身的方法//accept是接口中的抽象方法将其重写//方法1直接创建匿名内部类调用。arrayList.forEach(new ConsumerInteger() {Overridepublic void accept(Integer integer) {System.out.println(integer);}});// 方法2通过lambda表达式//当我们这样编写时代码很简洁但是可读性比较差。arrayList.forEach((a)-{System.out.println(a);});}public static void main(String[] args) {//举例 List中的sort方法ArrayListInteger arrayList new ArrayList();arrayList.add(10);arrayList.add(20);arrayList.add(15);/* arrayList.sort(new ComparatorInteger() {Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});*/// System.out.println(arrayList);arrayList.sort(((o1, o2) - {return o1.compareTo(o2);}));System.out.println(arrayList);}变量捕获 //变量捕获是指在匿名内部类或lambda表达式中所使用的变量在此之前与之后不能被修改或者此变量被final修饰