java jdk1.6的新特性 DeskTop SystemTray Console类 Compiler API Http Server API

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();
	}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值