发表时间:2022-03-25来源:网络
http://www.itbaizhan.cn/course/id/85.html
对应作业
(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(“包名.类名”);(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) 使用反射机制获取方法及构造方法的方法有哪些?并简述其含义

(1) 如何提高反射的效率
通过 setAccessible 提高性能
1. setAccessible 启用和禁用访问安全检查的开关,值为true 则指示反射的对象在使用时应该取消 Java 语言访问检查,值为 false 则指示反射的对象不实施 Java 语言访问检查,并不是为 true 就能访问为 false 就不能访问2. 禁止安全检查,可以提高反射的运行速度(2) 反射(Reflection):在程序运行时,可以改变程序的结构或变量的类型。
其它语言有: Python、ruby、JavaScript等语言都有这种特点。
(1) 泛型:在定义集合的同时定义集合中对象的类型
作用:增强程序的可读性和安全性
(2) Java新增的数据类型
1. ParameterizedType: 表 示 一 种 参 数 化 的 类 型 ,比 如Collection,可以获取 String 信息2. GenericArrayType:泛型数组类型3. TypeVariable:各种类型变量的公共父接口4. WildcardType:代表一种通配符类型表达式,比如? extends Number,? super Integer5. 注解
(1) 注解的作用
1、 不是程序本身,可以对程序作出解释。(这点和注释没有区别)2、 可以被其他程序(编译器等)读取。(注解信息处理流程,是注释和注解的重大区别,如果没有注解信息流程,则注解毫无意义)(2) 常见的内置注解
1. @Override:标识方法是重写的方法2. @Deprecated:标识的方法不建议使用3. @SuppressWarnings:用来抑制编译时的警告(1) 自定义注解的注意事项
注解元素必须要有值。我们定义注解元素时,经常使用空字符串,0 作为默认值。也经常使用负数(比如-1)表示不存在的含义
(2) 元注解的作用就是负责注解其他注解。在 Java 中定义了 4个标准的 meta-annotation 类型,它们被用来提供对其它annotation 类型作说明。这些类型和它们所支持的类在 java.lang.annotation 包中可以找到
1. @Target 用于描述注解的使用范围(即被描述的注解可以用什么地方)2. @Retention 表示需要在什么级别保存该注解信息,用于描述注解的生命周期3. @Documented4. @Inherited(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--20http://www.itbaizhan.cn/course/id/85.html
对应作业
(1) 在Java中创建线程的两种方式
1、 继承Thread2、 实现Runnable接口(2) 什么是同步与死锁?及线程间通信的方法有哪些?
1、 同步方法 同步监视器为当前对象 this2、 同步代码块(同步监视器/共享资源的对象){ }过多的同步就会导致死锁
线程间的通信方法;
1、 wait()2、 notify()3、 notifyAll()(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达到多线程的步骤

ThreadLocal 的使用场景为:用来解决数据库连接、Session管理等
上一篇:小白零基础学Java
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务