DeskTop
DeskTop类允许一个Java应用程序启动本地的另一个应用程序去处理URI或文件请求
Desktop desktop=Desktop.getDesktop();
//判断是否支持桌面
System.out.println(desktop.isDesktopSupported());
//打开一个网址
desktop.browse(new URI("http://www.baidu.com"));
//打开一个文件
desktop.open(new File("D:\\hello.txt"));
//编辑一个文件
desktop.edit(new File("D:\\ticket.txt"));
//发邮件
desktop.mail(new URI("mailto:10000@qq.com"));
//打印文件
desktop.print(new File("D:\\ticket.txt"));
SystemTray
表示桌面的系统托盘
SystemTray ad=SystemTray.getSystemTray();
//添加图标
ad.add(icon);
//添加菜单
PopupMenu menu=new PopupMenu();
MenuItem item=new MenuItem("苹果专区");
menu.add(item);
//添加分割线
menu.addSeparator();
//设置提示信息
TrayIcon icon=new TrayIcon(read);
icon.setToolTip("京东618");
icon.setPopupMenu(menu);
//添加鼠标事件
icon.addMouseListener(new MouseListener();
Console类
用来代替Scanner
一般是为了密码安全,让我们的输入更加安全
package com.oracle.core;
import java.io.Console;
import java.util.Scanner;
public class Console_study {
private static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
Console console=System.console();
System.out.println("请输入您的密码:");
char[] readPassword = console.readPassword();
System.out.println("您的密码是"+new String(readPassword));
}
}
Console类不能在非命令环境下使用
运行方法:
在bin目录下按住shift,右键在控制台中打开
输入java com.oracle.core.Console_study就可以运行此java文件
Compiler API
动态编译
private static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) throws IOException {
System.out.println("请输入java代码");
//输入一段文本
String input=scanner.nextLine();
//将你的文本保存为*.java的文件
OutputStream out=new FileOutputStream(new File("d:\\classes\\Hello.java"));
byte[] bytes = input.getBytes();
out.write(bytes);
out.close();
JavaCompiler javac=ToolProvider.getSystemJavaCompiler();
javac.run(null,null,null,"d:\classes\\Hello.java");
}
执行后就会生成一个Hello.class文件
运行这个文件:
Class<?> forName = Class.forName("com.oracle.core.XstreamStudy");
System.out.println(forName);
File file=new File("d:\\classes");
URL[] urls=new URL[]{file.toURI().toURL()};
//URLClassLoader 将这个类路径加入进来
URLClassLoader cl=new URLClassLoader(urls);
Class clz=Class.forName("Hello",true, cl);
Object hello=clz.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(clz);
MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
for(MethodDescriptor methoddes:methodDescriptors)
{
if(methoddes.getName().equals("main"))
{
Method method = methoddes.getMethod();
System.out.println(method.getName());
System.out.println(method.getReturnType());
System.out.println(method.getParameterCount());
Type[] genericParameterTypes = method.getGenericParameterTypes();
for(Type t:genericParameterTypes)
{
System.out.println(t.getTypeName());
System.out.println(t.getClass());
}
method.invoke(hello,(Object)new String[]{"a", "b", "c"});
}
}
把一个类、对象、字符串变成class类的过程叫做反射
反射很像内省,内省是在反射的基础上去做的
//从一个类文件到Class的过程
Class clz= Refct.class;
//从一个对象到Class的过程
Refct r=new Refct();
Class clz2 = r.getClass();
反射的目的是为了 获取该类的所有的信息
ClassLoader是类加载器,一旦程序运行,首先new的第一个对象是ClassLoader
由ClassLoader将类文件加载到内存中,ClassLoader自动从项目的bin目录开始找这个类
//从字符串到Class的过程
Class.forName("com.oracle.model.Person");
有的时候可能类路径不在这里
URL url1=new URL("file:/d:/classes/");
URL[]address=new URL[]{url1};
URLClassLoader ClassLoad=new URLClassLoader(address);
Class clz3=Class.forName("com.oracle.model.Person",true,ClassLoad);
先从bin目录去找,bin目录如果找不到,就从url里找
//1.获得类的名称
System.out.println(clz3.getName());
//剖析这个类
//2.获得这个类的接口
Class[] interfaces = clz3.getInterfaces();
for(Class iclz:interfaces)
{
System.out.println(iclz.getName());
}
//获得带泛型的接口
Type[] genericInterfaces = clz3.getGenericInterfaces();
for(Type t:genericInterfaces)
{
ParameterizedType p=(ParameterizedType)t;
System.out.println(p.getActualTypeArguments()[0]);
}
//判断类是否继承了某个类 单继承
Class superclass = clz3.getSuperclass(); //父类
System.out.println(superclass);
//获取类的父类的泛型对象Generic 直接
System.out.println(clz3.getGenericSuperclass()); //父类+泛型
Type[] actualTypeArguments = ((ParameterizedType)clz3.getGenericSuperclass()).getActualTypeArguments();
System.out.println(actualTypeArguments[0]);
//3.类的属性有哪些
//getFields 获取我自己和父类所有的属性 非public 无法使用
//getDeclaredFields 获取自己的属性 不管什么权限都可以使用
Field[] fields = clz3.getFields(); //获取我所有的属性 包含从父类继承的
Field[] gFields= clz3.getDeclaredFields(); //获取我自己的属性
Object newInstance = clz3.newInstance();
//实例化之后才能去设置值
for(Field field:gFields)
{
//field.setAccessible(false);
//System.out.println(field.get(newInstance));
field.setAccessible(true); //把他的私有权限放开 private没有用处
System.out.println(field.getName());
if(field.getName().equals("pid"))
{
field.setInt(newInstance, 1);
}
else if(field.getName().equals("pname"))
{
field.set(newInstance,"张三");
}
else if(field.getName().equals("sex"))
{
field.setChar(newInstance,'男');
}
}
System.out.println(newInstance);
//4.类的方法有哪些
Method[] methodss=clz3.getMethods(); //获取所有的方法 非public无法使用
for(Method method:methodss)
{
System.out.println(method.getName());
}
System.out.println("我自己的方法<><<><>");
Method[] methods=clz3.getDeclaredMethods();//获取我自己的方法 不管什么类型都可以使用
for(Method method:methods)
{
System.out.println(method.getName());
//可以去执行该方法
if(method.getName().contains("get"))
{
//我没有参数
Object invoke = method.invoke(newInstance,null);
System.out.println(invoke);
}
}
//反射的构造器
Constructor[] constructors = clz3.getConstructors();
System.out.println(constructors.length);
for(Constructor cus:constructors)
{
System.out.println(cus.newInstance(null));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Http Server API
内置服务器
每一个服务器都会有一个默认的端口
tomcat:8080
iis:80
服务器端:
public class HttpServerStudy {
public static void main(String[] args) {
//设置端口
InetSocketAddress socket=new InetSocketAddress(1997);
try {
HttpServer server=HttpServer.create(socket,10);
server.createContext("/login",new LoginHandler());
server.setExecutor(null);
server.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
public class LoginHandler implements HttpHandler {
public void handle(HttpExchange ex) throws IOException {
InetSocketAddress remoteAddress = ex.getRemoteAddress();
//对方的IP地址
//请求头
Headers requestHeaders = ex.getRequestHeaders();
Set<Entry<String, List<String>>> entrySet = requestHeaders.entrySet();
Iterator<Entry<String, List<String>>> iterator = entrySet.iterator();
while(iterator.hasNext())
{
Entry<String, List<String>> next = iterator.next();
System.out.println(next.getKey());
System.out.println(next.getValue());
}
//请求体
InputStream requestBody = ex.getRequestBody();
byte[] b=new byte[requestBody.available()];
requestBody.read(b);
InputStream in=new FileInputStream(new File("d:\\ticket.txt"));
byte[] bs=new byte[in.available()];
in.read(bs);
ex.getResponseHeaders().add("Content-Type","text/plain");
ex.sendResponseHeaders(200, 0);
OutputStream os = ex.getResponseBody();
// System.out.println(os);
os.write(bs);
os.close();
}
}