404、多线程概述
此后开始java高级篇
希望能越来越顺
11/10 下午13:51 公司
十五章 反射机制
api 动态获取
405、idea卸载
只需要配置一个idea
恢复成最初状态 删除config
keymaps 快捷键
system 系统相关
406、安装idea
407、安装
408、启动并完成helloworld
jdk安装路径
414、单核与多核cpu
单核:挂起
并行:
并发:一个cpu同时执行(时间片)多个任务。’
415、多线程的优点
单核cpu多线程不会更快。
提高程序的响应
提高cpu利用率
改善程序结构
416、线程创建和使用
每个线程通过某个特定Thread对象的run()方法完成操作,run()方法主体称为线程体。
通过该Thread对象的start()方法启动线程,
在start()方法之后,开始执行。
417、线程两个问题
public static void main(String[] args) {
/*MyThread1 m1=new MyThread1();
MyThread2 m2=new MyThread2();
m1.start();
m2.start();*/
//创建匿名子类方式
new Thread(){
@Override
public void run() {
for(int i=0;i<100;i++){
if(i%2==0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}.start();
new Thread(){
@Override
public void run() {
for(int i=0;i<100;i++){
if(i%2==1){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}.start();
}
这节课讲了两个例子,后面使用匿名子类方式进行改写。
所以什么是匿名子类,
没有解释到位。
419、线程的常用方法 32
yield:释放当前cpu的执行权
join():在线程a中调用线程b的join(),此时a变成阻塞状态,直到b执行完后a才结束阻塞状态。
多线程这块听不懂
该不该放弃?
447、复习线程通信 15
634、java反射机制 12
获取class类实例‘
创建运行时类的对象
调用运行时类指定结构
允许程序运行期间 借助reflectionapi获取任何类的内部信息。
并能直接操作任意对象的内部属性方法。
反射方式:实例化对象 getClass()方法 得到完整的包类
反射可以做到的事
构造任意类的对象
获取泛型信息
调用任意一个对象的成员变量和方法
java.lang.Class
用来描述类的类
635、反射之前类的实例化
11/12下午
public class ReflectionTest {
//反射之前对Person类的操作
@Test
public void test1(){
Person p1=new Person("Tom",12);
//通过对象调用内部属性和方法
p1.age=10;
System.out.println(p1.toString());
p1.show();
//Person类外部,不允许通过Person类对象调用其内部私有结构
}
}
public class Person {
private String name;
public int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private Person(String name) {
this.name = name;
}
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 "Person{"+
"name='"+name+'\''+
",age="+age+
'}';
}
public void show(){
System.out.println("你好,我是");
}
private String showNation(String nation){
System.out.println("我的国籍是:"+nation);
return nation;
}
}
656、调用运行时类中的指定构造器
@Test
public void test2() throws NoSuchMethodException, InvocationTargetException, InstantiationException,
IllegalAccessException {
Class clazz=Person.class;
Constructor cons=clazz.getConstructor(String.class, int.class);
Object obj = cons.newInstance("Tom", 12);
Person p=(Person)obj;
System.out.println(p.toString());
}
657、调用类的私有结构
//通过反射 可以调用Person类的私有结构
//调用方法
Method show = clazz.getDeclaredMethod("show");//方法 形参类型 不写等于调用空参\
show.invoke(p);
//调用Person的私有结构
Constructor cons1 = clazz.getDeclaredConstructor(String.class);
cons1.setAccessible(true);
Person p1 = (Person) cons1.newInstance("Jerry");
System.out.println(p1);
//调用私有属性和方法
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"hanmeimei");
System.out.println(p1.getName());
//调用私有方法
Method showNation = clazz.getDeclaredMethod("showNation", String.class);
showNation.setAccessible(true);
String nation=(String)showNation.invoke(p1,"中国");
System.out.println(nation);
}
638、反射和封装
反射机制和单例 封装性
是不是矛盾
再听一听
问题2、
639、clazz理解 10
clazz对象
Class 反射源头
1、类的加载过程:
程序经过javac.exe后,会生成一个或多个字节码文件(.class)
接着使用java.exe命令对某个字节码文件进行解释运行。
相当于将某个字节码文件加载到内存中,此过程称为类的加载。
加载到内存中的类,称为运行时类。此运行时类作为Class对象。
Class clazz=Person.class;
通过类造对象,类本身也是对象,是Class类的对象。