反射
Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有的属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象方法的功能称为Java语言的反射机制。
Class类
三种创建Class类的对象方法
//使用类的class属性
Class c=Demo.class;
//使用Class类的forName方法
try{
Class c=Class.forName("test.Demo");
}catch(ClassNotException e){
e.printStackTrace();
}
//使用Object对象的getClass方法
Demo demo=new Demo();
Class c=demo.getClass();
获取构造方法
获取成员变量
获取方法
使用时百度即可
多线程
继承Thread类
通过继承Thread类创建并执行一个线程的步骤如下:
创建一个继承自Thread类的子类
覆写Thread类的run方法
创建线程类的一个对象
通过线程类的对象调用start方法启动线程(启动之后会自动调用覆写的run方法执行线程)
Thread类中常用的两个构造方法
public Thread():创建一个新的线程对象
public Thread(String threadName):创建一个名称为threadName的线程对象
继承Thread类创建一个新的线程的语法
public class ThreadTest extends Thread{
}
当执行一个程序时,会自动产生一个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序就为单线程程序。主方法线程启动由Java虚拟机负责,程序员负责启动自己的线程,这是通过调用start()方法实现的
public static void main(String[] agrs){
ThreadTest test =new ThreadTest();
test.start();
}
注:如果start()方法调用一个已经启动的程序会抛出IllegalThreadStateException异常。
public class ThreadTest extends Thread{
private int count=10;
public void run(){
while(true){
System.out.print(count+" ");
if(--count==0)
break;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadTest test=new ThreadTest();
test.start();
}
}
实现Runnable接口
实现Runnable接口的语法
public class Thread extends Object implements Runnable
实现Runnale接口的程序会创建一个Thread对象,并将Runnbale对象与Thread对象相关联。Thread类中有以下两个构造方法
public Thread(Runnable target):分配新的Thread对象,以便将target作为其运行对象
public Thread(Runnable target,String name):分配新的Thread对象,以便将target作为其运行对象,将指定的name作为其名称
使用Runnable接口启动新的线程的步骤
建立Runnable对象
使用参数为Runnable对象的构造方法创建Thread实例
调用start()方法启动线程
实现图标移动的功能
import java.awt.Container;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class SwingAndThread extends JFrame{
private JLabel jl=new JLabel();//声明JLabel对象
private static Thread t;//声明线程对象
private int count=0;//声明计数对象
private Container container=getContentPane();//声明容器
public SwingAndThread(){
setBounds(300,200,250,100);//绝对定位窗口大小与位置
container.setLayout(null);//使窗体不适用任何布局管理器
try{
//获取图片的URL,此图片与本类在同一包下
URL url=SwingAndThread.class.getResource("1.gif");
Icon icon=new ImageIcon(url);
jl.setIcon(icon);
}catch(NullPointerException ex){
System.out.println("图片不存在,请将1.gif复制到当前目录下");
return;
}
//设置图片在标签的最左方
jl.setHorizontalAlignment(SwingConstants.LEFT);
jl.setBounds(10,10,200,50);//设置标签的位置和大小
jl.setOpaque(true);
t=new Thread(new Roll());
t.start();//启动线程
container.add(jl);//将标签添加到容器中
setVisible(true);//使窗体可见
//设置窗体的关闭方式
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
class Roll implements Runnable{//定义内部类,实现Runnable接口
@Override
public void run(){
while(count<=200){
//将标签的横坐标用变量表示
jl.setBounds(count,10,200,50);
try {
Thread.sleep(1000);//为了体现进度条的移动效果,使线程休眠1000ms
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
count+=4;
if(count==200){
//当图标到标签的最右边时,使其回到标签最左边
count=10;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new SwingAndThread();
}
}