知识屋:更实用的电脑技术知识网站
所在位置:首页 > 教育

学无止境之小白学java……第019天

发表时间:2022-03-25来源:网络

学习主题:反射技术

对应视频:

http://www.itbaizhan.cn/course/id/85.html

对应作业

1. 反射机制介绍_Class对象获取

(1) 反射机制的常见作用?

1、 动态的加载类、动态的获取另类的信息(属性,方法,构造器)2、 动态构造对象3、 动态调用类和对象的任意方法、构造器4、 动态调用和处理属性5、 获取泛型信息6、 处理注解

(2) 获取Class对象的方式

1、 通过对象的getClass()方法获取 ——Class c1 = u1.getClass();2、 通过字节码文件获取——Class c2 = User.class;3、 通过Class类的静态方法获取——Class c3 = Class.forName(“包名.类名”);

2. 反射机制动态操作方法_属性_构造器

(1) 使用反射机制获取类的名称和属性的方法有哪些?并简述其含义

package cn.sxt.entity; public class User { private int userId; private String name; private String pwd; public User() { } public User(int userId, String name, String pwd) { this.userId = userId; this.name = name; this.pwd = pwd; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } package cn.sxt.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException { String path = "cn.sxt.entity.User"; //1、获取类的名称 Class c = Class.forName(path); System.out.println("类的全名称:" + c.getName()); System.out.println("类的名称:" + c.getSimpleName()); //获取父类的Class对象 Class cSuper = c.getSuperclass(); System.out.println(cSuper.getName()); System.out.println(cSuper.getSimpleName()); //2、获取类的属性信息 //Field f = c.getField("userId");//只能获取公共的属性 //System.out.println(f); Field [] fields = c.getFields();//只能获取公共的属性 System.out.println(fields.length); Field[] fields2 = c.getDeclaredFields();//可获得全部的属性 System.out.println(fields2.length); for (Field field : fields2) { //System.out.println(field);//调用了toString()方法 System.out.println(field.getModifiers() + "\t"+ field.getType() + "\t" + field.getName()); } //3、获取类的方法信息 Method[] methods = c.getDeclaredMethods(); System.out.println(methods.length); for (Method method : methods) { //System.out.println(method); System.out.println("访问权限:" + method.getModifiers()); System.out.println("返回值类型 :" + method.getReturnType()); System.out.println("方法的名称:" + method.getName()); //获取方法的参数 Class [] cPara = method.getParameterTypes(); for (Class c1 : cPara) { System.out.println(c1.getTypeName() + "\t"); } System.out.println("\n===================="); } System.out.println("\n========================"); //4、获取类的构造器 Constructor[] cons = c.getConstructors(); for (Constructor constructor : cons) { System.out.println(constructor); } Constructor con = c.getConstructor(null); System.out.println(con); Constructor con2 = c.getConstructor(int.class,String.class,String.class); System.out.println(con2); } } 类的全名称cn.sxt.entity.User 类的名称User java.lang.Object Object 0 3 2 int userId 2 class java.lang.String name 2 class java.lang.String pwd 6 访问权限1 返回值类型 class java.lang.String 方法的名称getName ==================== 访问权限1 返回值类型 void 方法的名称setName java.lang.String ==================== 访问权限1 返回值类型 int 方法的名称getUserId ==================== 访问权限1 返回值类型 void 方法的名称setUserId int ==================== 访问权限1 返回值类型 class java.lang.String 方法的名称getPwd ==================== 访问权限1 返回值类型 void 方法的名称setPwd java.lang.String ==================== ======================== public cn.sxt.entity.User() public cn.sxt.entity.User(int,java.lang.String,java.lang.String) public cn.sxt.entity.User() public cn.sxt.entity.User(int,java.lang.String,java.lang.String)


(2) 使用反射机制获取方法及构造方法的方法有哪些?并简述其含义

3. 提高反射效率

(1) 如何提高反射的效率

通过 setAccessible 提高性能

1. setAccessible 启用和禁用访问安全检查的开关,值为true 则指示反射的对象在使用时应该取消 Java 语言访问检查,值为 false 则指示反射的对象不实施 Java 语言访问检查,并不是为 true 就能访问为 false 就不能访问2. 禁止安全检查,可以提高反射的运行速度

(2) 反射(Reflection):在程序运行时,可以改变程序的结构或变量的类型。

其它语言有: Python、ruby、JavaScript等语言都有这种特点。

4. 反射操作泛型

(1) 泛型:在定义集合的同时定义集合中对象的类型

作用:增强程序的可读性和安全性

(2) Java新增的数据类型

1. ParameterizedType: 表 示 一 种 参 数 化 的 类 型 ,比 如Collection,可以获取 String 信息2. GenericArrayType:泛型数组类型3. TypeVariable:各种类型变量的公共父接口4. WildcardType:代表一种通配符类型表达式,比如? extends Number,? super Integer

5. 注解

(1) 注解的作用

1、 不是程序本身,可以对程序作出解释。(这点和注释没有区别)2、 可以被其他程序(编译器等)读取。(注解信息处理流程,是注释和注解的重大区别,如果没有注解信息流程,则注解毫无意义)

(2) 常见的内置注解

1. @Override:标识方法是重写的方法2. @Deprecated:标识的方法不建议使用3. @SuppressWarnings:用来抑制编译时的警告

6. 自定义注解

(1) 自定义注解的注意事项

注解元素必须要有值。我们定义注解元素时,经常使用空字符串,0 作为默认值。也经常使用负数(比如-1)表示不存在的含义

(2) 元注解的作用就是负责注解其他注解。在 Java 中定义了 4个标准的 meta-annotation 类型,它们被用来提供对其它annotation 类型作说明。这些类型和它们所支持的类在 java.lang.annotation 包中可以找到

1. @Target 用于描述注解的使用范围(即被描述的注解可以用什么地方)2. @Retention 表示需要在什么级别保存该注解信息,用于描述注解的生命周期3. @Documented4. @Inherited

7. 反射读取注解信息

(1) ORM的含义

ORM(Object Relationship Mapping)对象关系映射

1) 类与表结构对应2) 属性和字段对应3) 对象和记录对应

(2) 举例说明注解的使用

package cn.sxt.student; @SxtTable("tb_student") public class Student { //私有属性 @SxtField(columnName = "id",type = "int",length = 10) private int id; @SxtField(columnName = "stuName",type = "varchar",length = 20) private String stuName; @SxtField(columnName = "age",type = "int",length = 10) private int age; public Student() { } public Student(int id, String stuName, int age) { this.id = id; this.stuName = stuName; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } package cn.sxt.student; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) //注解的使用范围 @Retention(RetentionPolicy.RUNTIME) //在运行时起作用 public @interface SxtTable { String value(); } package cn.sxt.student; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SxtField { String columnName();//数据库中列的名称 String type();//数据库中列的类型 int length();//数据库中列的长度 } package cn.sxt.student; import java.lang.annotation.Annotation; import java.lang.reflect.Field; public class TestStu { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException { //1、创建Student类的Class对象 Class clazz = Class.forName("cn.sxt.student.Student"); //2、得到Student类的所有注解 Annotation[] annotations = clazz.getDeclaredAnnotations(); for (Annotation a : annotations) { System.out.println(a); } System.out.println("============================"); //3、获取指定的注解 SxtTable st = (SxtTable) clazz.getDeclaredAnnotation(SxtTable.class); System.out.println(st); //4、获取属性的注解 Field field = clazz.getDeclaredField("stuName"); SxtField sf= field.getDeclaredAnnotation(SxtField.class); System.out.println(sf.columnName() + "--"+ sf.type()+ "--"+ sf.length()); } } @cn.sxt.student.SxtTable(value=tb_student) ============================ @cn.sxt.student.SxtTable(value=tb_student) stuName--varchar--20


学习主题:多线程和并发编程

对应视频:

http://www.itbaizhan.cn/course/id/85.html

对应作业

8. 多线程知识回顾

(1) 在Java中创建线程的两种方式

1、 继承Thread2、 实现Runnable接口

(2) 什么是同步与死锁?及线程间通信的方法有哪些?

1、 同步方法 同步监视器为当前对象 this2、 同步代码块(同步监视器/共享资源的对象){ }

过多的同步就会导致死锁

线程间的通信方法;

1、 wait()2、 notify()3、 notifyAll()

9. 实现多线程的第三种方式

(1) 之前学习实现的多线程的两种方式有什么缺点?第三种实现多线程的方式是什么?

1. 继承Thread2. 实现Runnable接口

缺点

1. 没有返回值2. 不支持泛型3. 异常必须处理

第三种实现多线程的方式:实现Callable接口,重写call方法

(2) 实现Callable接口来实现多线程的好处

Callable 功能更加强大

1. Future 接 口 位 于 java.util.concurrent 包 中 ,可 以 对 具 体Runnable、Callable 任务的执行结果进行取消(cancel 方法,尝试取消执行此任务)、查询是否完成(isDone 方法)、获取结果(get 方法,等待完成,然后检索其结果)等。2. FutrueTask 是 Futrue 接口的唯一的实现类3. FutureTask 同时实现了 Runnable, Future 接口。它既可以作为 Runnable 被线程执行,又可以作为 Future 得到Callable 的返回值

(3) 写出实现Callable达到多线程的步骤

14. ThreadLocal的使用场景

ThreadLocal 的使用场景为:用来解决数据库连接、Session管理等

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜