一 回顾
二 作业01
step01 需求
step03 代码-任务类
三 作业02
step01 需求
四 作业03
step01 需求
step02 分析
step03 代码 - 任务对象
五 Junit
步骤
step01 新建 lib 文件
step02 将jar放入到lib目录下
step03 将jar添加项目依赖
step04 新建类 定义方法
package com.qf.demo1;
import org.junit.Test;
public class Test01 {
@Test
public void showInfo(){
System.out.println("文哈哈哈");
}
}
文哈哈哈
六 反射的概念(重点)
① :成员变量:Field [ ]
②:构造方法: Constructor [ ]
③:成功方法:Method [ ]
七 获取Class对象
八 获取构造方法
代码-学生类
九 获取成员方法
代码
@Test
public void showInfo() throws ClassNotFoundException {
Class aClass = Class.forName("com.qf.demo3.Students");
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
public void com.qf.demo3.Students.showInfo()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
@Test
public void showInfo1() throws ClassNotFoundException {
Class aClass = Class.forName("com.qf.demo3.Students");
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
private void com.qf.demo3.Students.show(java.lang.String)
public void com.qf.demo3.Students.showInfo()
代码
@Test
public void showInfo2() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class aClass = Class.forName("com.qf.demo3.Students");
//获得单个公有方法
Method show = aClass.getMethod("showInfo");
//获得公有构造方法
Constructor con = aClass.getConstructor();
//实例化对象
Object o = con.newInstance();
//调用方法
show.invoke(o);
}
@Test
public void showInfo3() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class aClass = Class.forName("com.qf.demo3.Students");
//获得单个私有方法
Method showInfo = aClass.getDeclaredMethod("show", String.class);
//使用暴力反射去除私有
showInfo.setAccessible(true);
//获取公有构造方法
Constructor con =aClass.getConstructor();
//实例化构造方法
Object obj = con.newInstance();
//方法调用放回对象
Object o = showInfo.invoke(obj, "文静");
①:类对象后可以获得方法showInfo
②:方法有个invoke方法:showInfo.invoke(对象,“方法的参数”)
③获得单个方法是,有输入 修饰符.class来辨别是哪个方法
十一 案例
step01 需求 利用反射来忽略集合泛型
step02 分析
step03 代码
public class Test01 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
List<String> list = new ArrayList<>();
//本来泛型只能输入同一个类型
list.add("文静");
// list.add(23);
//获得当前类对象
Class<? extends List> aClass = list.getClass();
//获得方法,重写方法
Method add = aClass.getMethod("add", Object.class);
//调用方法
add.invoke(list,11);
System.out.println(list);
}
}
十二 案例(重点)
step01 需求 不修改任何的 java 代码 调用类中任意的方法
step02 分析
step03 新建配置文件 admin.properties文件
step0 学生类
package com.qf.demo6;
import com.sun.xml.internal.ws.addressing.WsaActionUtil;
public class Students {
private String name;
private int age;
public Students() {
}
public void show (){
System.out.println("你好");
}
public void showInfo(String name,int age){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
step04 在配置文件编写内容
package com.qf.demo6;
import com.sun.xml.internal.ws.api.ha.StickyFeature;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class AdminPropertiesUtils {
//私有的成员变量
private static AdminPropertiesUtils adminPropertiesUtils;
private Properties properties;
//私有的构造方法
private AdminPropertiesUtils() throws IOException {
properties = new Properties();
//必须是在同一个包下
//通过反射来加载配置文件
InputStream is = AdminPropertiesUtils.class.getResourceAsStream("admin.properties");
properties.load(is);
}
//提供外部访问的静态方法
public static synchronized AdminPropertiesUtils getInstance() throws IOException {
if (adminPropertiesUtils==null){
adminPropertiesUtils = new AdminPropertiesUtils();
}
return adminPropertiesUtils;
}
public String getValue(String key){
return properties.getProperty(key);
}
}
step06 测试类
package com.qf.demo6;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
String classnaem = AdminPropertiesUtils.getInstance().getValue("classname");
String methodname = AdminPropertiesUtils.getInstance().getValue("methodname");
Class[] classes = showClass();
if (classes==null||classes.length<=0){
//获取方法
Class aClass = Class.forName(classnaem);
Constructor con = aClass.getConstructor();
Method method = aClass.getMethod(methodname);
Object o = con.newInstance();
method.invoke(o);
}else {
Class<?> aClass = Class.forName(classnaem);
Constructor<?> con = aClass.getConstructor();
Method method = aClass.getMethod(methodname,classes);
Object o = con.newInstance();
method.invoke(o,"文静",18);
}
}
public static Class[] showClass() throws IOException {
String par = AdminPropertiesUtils.getInstance().getValue("par");
if (par==null||"".equals(par)){
return null;
}
List<Class> list = new ArrayList();
String[] split = par.split(",");
for (String s : split) {
if (s.equals("String")){
list.add(String.class);
}else if (s.equals("int")){
list.add(int.class);
}else {
list.add(Object.class);
}
}
return list.toArray(new Class[list.size()]);
}
}
十三 jdk8与jdk9接口的新特性(了解)
13.1 简介
13.2 默认的方法
接口类
①接口中的默认方法 实现类可以不重写
package com.qf.demo7;
public interface Inner {
public default void showInfo(){
System.out.println("哈哈");
}
}
实现类
②.实现类的其它方法可以调用接口中的默认方法,调用的语法是 接口的名称.super.方法的名称()
package com.qf.demo7;
public class Impl implements Inner {
public void show(){
Inner.super.showInfo();
}
}
测试类
③.接口中的默认方法只能通过实例化来进行调用
package com.qf.demo7;
public class Test {
public static void main(String[] args) {
Impl impl = new Impl();
impl.show();
}
}
哈哈
13.3 静态方法
接口
package com.qf.demo8;
public interface Inner {
static void showInfo(){
System.out.println("我是静态方法");
}
}
实现类
①接口实现类不能重写接口中的静态方法
package com.qf.demo8;
public class Impl implements Inner{
}
测试类
②接口中静态方法可以直接通过接口名称来进行调用
package com.qf.demo8;
public class Test01 {
public static void main(String[] args) {
Inner.showInfo();
}
}
我是静态方法
13.4 私有方法
十四 Lambda 表达式(重点)
14.1 简介
代码
package com.qf.demo9;
public class Test {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
new Thread(()->{
System.out.println(Thread.currentThread().getName());
}).start();
}
}
14.2没有返回值 没有参数函数式接口
①.如果方法没有返回值 只有一句方法体 可以省略大括号与分号
package com.qf.demo10;
public interface Inner {
void showInfo();
}
package com.qf.demo10;
public class Test01 {
public static void main(String[] args) {
// show(()->{
// System.out.println("文静");
// });
show(()-> System.out.println("文静"));
}
public static void show(Inner inner){
inner.showInfo();
}
}
14.3 带返回值函数接口
package com.qf.demo11;
import java.io.Serializable;
public class Student implements Serializable {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
实现类,
可以实现引用数组的排序:Arrays.sort(students, new Comparator<Student>() {});
②如果方法体 只有一句话 这句话是retrun 就可以省略大括号 与retrun与分号
package com.qf.demo11;
import java.util.Arrays;
import java.util.Comparator;
public class Test01 {
public static void main(String[] args) {
Student [] students = new Student[3];
students [0] = new Student("文静1", 20);
students [1] = new Student("文静", 22);
students [2] = new Student("文静", 21);
System.out.println(Arrays.toString(students));
// Arrays.sort(students, new Comparator<Student>() {
// @Override
// public int compare(Student o1, Student o2) {
// return o1.getAge()-o2.getAge();
// }
// });
// Arrays.sort(students,(Student o1,Student o2)->{return o1.getAge()-o2.getAge();});
Arrays.sort(students,(o1,o2)->o1.getAge()-o2.getAge());
System.out.println(Arrays.toString(students));
}
}
[Student{name='文静1', age=20}, Student{name='文静', age=22}, Student{name='文静', age=21}]
[Student{name='文静1', age=20}, Student{name='文静', age=21}, Student{name='文静', age=22}]
14.4 自定义函数接口 带参数带返回值
14.5 自定义函数接口 一个参数 有返回值