1. 程式人生 > >The Art Of Java ...

The Art Of Java ...

JDK6的新特性 

JDK6的新特性之一_Desktop類和SystemTray類 
JDK6的新特性之二_使用JAXB2來實現物件與XML之間的對映 
JDK6的新特性之三_理解StAX 
JDK6的新特性之四_使用Compiler API 
JDK6的新特性之五_輕量級HttpServer 
JDK6的新特性之七_用Console開發控制檯程式 
JDK6的新特性之八_嵌入式資料庫Derby 
JDK6的新特性之六_插入式註解處理API 
JDK6的新特性之九_CommonAnnotations 
JDK6的新特性之十_Web服務元資料 
JDK6的新特性之十一_更簡單強大的JAX-WS 

JDK6的新特性之十三_JTable的排序和過濾 
JDK6的新特性之十二_指令碼語言支援 



(1) JDK6的新特性之一_Desktop類和SystemTray類 

在JDK6中 ,AWT新增加了兩個類:Desktop和SystemTray,前者可以用來開啟系統預設瀏覽器瀏覽指定的URL,開啟系統預設郵件客戶端給指定的郵箱 發郵件,用預設應用程式開啟或編輯檔案(比如,用記事本開啟以txt為字尾名的檔案),用系統預設的印表機列印文件;後者可以用來在系統托盤區建立一個託 盤程式。 

Java程式碼 
在JDK6中 ,AWT新增加了兩個類:Desktop和SystemTray,前者可以用來開啟系統預設瀏覽器瀏覽指定的URL,開啟系統預設郵件客戶端給指定的郵箱發郵件,用預設應用程式開啟或編輯檔案(比如,用記事本開啟以txt為字尾名的檔案),用系統預設的印表機列印文件;後者可以用來在系統托盤區建立一個托盤程式.下面程式碼演示了Desktop和SystemTray的用法. 


/** 

*/
 
import java.awt.Desktop; 
import java.awt.SystemTray; 
import java.awt.TrayIcon; 
import java.awt.Toolkit; 
import java.awt.Image; 
import java.awt.PopupMenu; 
import java.awt.Menu; 
import java.awt.MenuItem; 
import java.awt.AWTException; 
import java.io.File; 
import
 java.io.IOException; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class DesktopTray { 
    private static Desktop desktop; 
    private static SystemTray st; 
    private static PopupMenu pm; 
    public static void main(String[] args) { 
        if(Desktop.isDesktopSupported()){//判斷當前平臺是否支援Desktop類 
            desktop = Desktop.getDesktop(); 
        } 
        if(SystemTray.isSupported()){//判斷當前平臺是否支援系統托盤 
            st = SystemTray.getSystemTray(); 
            Image image = Toolkit.getDefaultToolkit().getImage("netbeans.png");//定義托盤圖示的圖片            
            createPopupMenu(); 
            TrayIcon ti = new TrayIcon(image, "Desktop Demo Tray", pm); 
            try { 
                st.add(ti); 
            } catch (AWTException ex) { 
                ex.printStackTrace(); 
            } 
        } 
    } 
    
    public static void sendMail(String mail){ 
        if(desktop!=null && desktop.isSupported(Desktop.Action.MAIL)){ 
            try { 
                desktop.mail(new URI(mail)); 
            } catch (IOException ex) { 
                ex.printStackTrace(); 
            } catch (URISyntaxException ex) { 
                ex.printStackTrace(); 
            } 
        }            
    } 
    
    public static void  openBrowser(String url){ 
        if(desktop!=null && desktop.isSupported(Desktop.Action.BROWSE)){ 
            try { 
                desktop.browse(new URI(url)); 
            } catch (IOException ex) { 
                ex.printStackTrace(); 
            } catch (URISyntaxException ex) { 
                ex.printStackTrace(); 
            } 
        } 
    } 
    
    public static void  edit(){ 
        if(desktop!=null && desktop.isSupported(Desktop.Action.EDIT)){ 
            try { 
                File txtFile = new File("test.txt"); 
                if(!txtFile.exists()){ 
                    txtFile.createNewFile(); 
                } 
                desktop.edit(txtFile); 
            } catch (IOException ex) { 
                ex.printStackTrace(); 
            } 
        } 
    } 
    
    public static void createPopupMenu(){ 
       pm = new PopupMenu(); 
        MenuItem openBrowser = new MenuItem("Open My Blog"); 
        openBrowser.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) { 
                openBrowser("http://blog.csdn.net/china"); 
            } 
        }); 
        
        MenuItem sendMail = new MenuItem("Send Mail to me"); 
        sendMail.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) { 
                sendMail("mailto:[email protected]"); 
            } 
        }); 
        
        MenuItem edit = new MenuItem("Edit Text File"); 
        sendMail.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) { 
                edit(); 
            } 
        }); 
        
        MenuItem exitMenu = new MenuItem("&Exit"); 
        exitMenu.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent e) { 
                System.exit(0); 
            } 
        }); 
        pm.add(openBrowser); 
        pm.add(sendMail); 
        pm.add(edit); 
        pm.addSeparator(); 
        pm.add(exitMenu);    
    } 

如果在Windows中執行該程式,可以看到在系統托盤區有一個圖示,右擊該圖示會彈出一個選單,點選Open My Blog會開啟IE,並瀏覽"http://blog.csdn.net/china";點選Send Mail to me會開啟Outlook Express給我發郵件;點選Edit Text File會開啟記事本編輯在程式中建立的檔案test.txt 


(2) JDK6的新特性之二_使用JAXB2來實現物件與XML之間的對映 

JAXB是Java Architecture for XML Binding的縮寫,可以將一個Java物件轉變成為XML格式,反之亦然。我們把物件與關係資料庫之間的對映稱為ORM, 其實也可以把物件與XML之間的對映稱為OXM(Object XML Mapping). 原來JAXB是Java EE的一部分,在JDK6中,SUN將其放到了Java SE中,這也是SUN的一貫做法。JDK6中自帶的這個JAXB版本是2.0, 比起1.0(JSR 31)來,JAXB2(JSR 222)用JDK5的新特性Annotation來標識要作繫結的類和屬性等,這就極大簡化了開發的工作量。實際上,在Java EE 5.0中,EJB和Web Services也通過Annotation來簡化開發工作。另外,JAXB2在底層是用StAX(JSR 173)來處理XML文件。 閒話不多說了,下面用程式碼演示在JDK6中如何來用JAXB2 

public class JAXB2Tester { 
    public static void main(String[] args) throws JAXBException,IOException { 
        JAXBContext context = JAXBContext.newInstance(Person.class); 
        //下面程式碼演示將物件轉變為xml 
        Marshaller m = context.createMarshaller(); 
        Address address = new Address("China","Beijing","Beijing","ShangDi West","100080"); 
        Person p = new Person(Calendar.getInstance(),"JAXB2",address,Gender.MALE,"SW"); 
        FileWriter fw = new FileWriter("person.xml"); 
        m.marshal(p,fw); 

        //下面程式碼演示將上面生成的xml轉換為物件 
        FileReader fr = new FileReader("person.xml"); 
        Unmarshaller um = context.createUnmarshaller(); 
        Person p2 = (Person)um.unmarshal(fr); 
        System.out.println("Country:"+p2.getAddress().getCountry()); 
    } 


@XmlRootElement//表示person是一個根元素 
class Person {    
    @XmlElement 
    Calendar birthDay; //birthday將作為person的子元素 

    @XmlAttribute 
    String name; //name將作為person的的一個屬性 

    public Address getAddress() { 
        return address; 
    } 

    @XmlElement 
    Address address; //address將作為person的子元素 

    @XmlElement 
    Gender gender; //gender將作為person的子元素 

    @XmlElement 
    String job; //job將作為person的子元素 

    public Person(){ 
    } 
    
    public Person(Calendar birthDay, String name, Address address, Gender gender, String job) { 
        this.birthDay = birthDay; 
        this.name = name; 
        this.address = address; 
        this.gender = gender; 
        this.job = job; 
    } 


enum Gender{ 
    MALE(true), 
    FEMALE (false); 
    private boolean value; 
    Gender(boolean _value){ 
        value = _value; 
    } 


class Address { 
    @XmlAttribute 
    String country; 
    @XmlElement 
    String state; 
    @XmlElement 
    String city; 
    @XmlElement 
    String street; 
    String zipcode; //由於沒有新增@XmlElement,所以該元素不會出現在輸出的xml中 

    public Address() { 
    } 

    public Address(String country, String state, String city, String street, String zipcode) { 
        this.country = country; 
        this.state = state; 
        this.city = city; 
        this.street = street; 
        this.zipcode = zipcode; 
    } 


    public String getCountry() { 
        return country; 
    } 

執行該程式,我們會得到一個person.xml的檔案,如下: 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 

<person name="JAXB2"
      <birthDay>2006-12-28T08:49:27.203+00:00</birthDay> 
       <address country="China"
            <state>Beijing</state> 
            <city>Beijing</city> 
            <street>ShangDi West</street> 
  </address
       <gender>MALE</gender> 
       <job>SW</job> 
</person>  控制檯會輸出 

Country:China 

最後,想說一點,除了JAXB之外,我們還可以通過XMLBeans和Castor等來實現同樣的功能。 

(3) JDK6的新特性之三_理解StAX 

StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一種處理XML文件的API 

StAX的來歷 

在JAXP1.3(JSR 206)有兩種處理XML文件的方法:DOM(Document Object Model)和SAX(Simple API for XML).由於JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會用到StAX所以Sun決定把StAX加入到JAXP家族當中來,並將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護版本). JDK6裡面JAXP的版本就是1.4. 

StAX簡介 

StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文件的API.StAX通過提供一種基於事件迭代器(Iterator)的API讓程式設計師去控制xml文件解析過程,程式遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程式拉出來的,也就是程式促使解析器產生一個解析事件然後處理該事件,之後又促使解析器產生下一個解析事件,如此迴圈直到碰到文件結束符;SAX也是基於事件處理xml文件,但卻是用推模式解析,解析器解析完整個xml文件後,才產生解析事件,然後推給程式去處理這些事件;DOM採用的方式是將整個xml文件對映到一顆記憶體樹,這樣就可以很容易地得到父節點和子結點以及兄弟節點的資料,但如果文件很大,將會嚴重影響效能。下面是這幾種API的比較(轉載自http://www.blogjava.net/hsith/archive/2006/06/29/55817.html) 

XML Parser API Feature Summary  Feature  StAX  SAX  DOM  TrAX  
API Type  Pull, streaming  Push, streaming  In memory tree  XSLT Rule  
Ease of Use  High  Medium  High  Medium  
XPath Capability  No  No  Yes  Yes  
CPU and Memory Efficiency  Good  Good  Varies  Varies  
Forward Only  Yes  Yes  No  No  
Read XML  Yes  Yes  Yes  Yes  
Write XML  Yes  No  Yes  Yes  
Create, Read, Update, Delete  No  No  Yes  No  


StAX程式碼演示 

下面程式碼演示瞭如何通過StAX讀取xml文件和生成xml文件 

public class StaxTester { 
    public static void main(String[] args) throws XMLStreamException, FileNotFoundException { 
        readXMLByStAX();//用XMLEventReader解析xml文件 
        writeXMLByStAX();//用XMLStreamWriter寫xml文件 
    } 

    private static void readXMLByStAX() throws XMLStreamException, FileNotFoundException { 
        XMLInputFactory xmlif = XMLInputFactory.newInstance(); 
        XMLEventReader xmler = xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream("test.xml")); 
        XMLEvent event; 
        StringBuffer parsingResult = new StringBuffer(); 
        while (xmler.hasNext()) { 
            event = xmler.nextEvent();            
            if (event.isStartElement()) { //如果解析的是起始標記 
                StartElement se = event.asStartElement(); 
                parsingResult.append("<"); 
                parsingResult.append(se.getName()); 
                if(se.getName().getLocalPart().equals("catalog")) { 
                    parsingResult.append(" id=\""); 
                    parsingResult.append(se.getAttributeByName(new QName("id")).getValue()); 
                    parsingResult.append("\""); 
                } 
                parsingResult.append(">"); 
            } else if (event.isCharacters()) { //如果解析的是文字內容 
                parsingResult.append(event.asCharacters().getData()); 
            } else if(event.isEndElement()){ //如果解析的是結束標記 
                parsingResult.append("</"); 
                parsingResult.append(event.asEndElement().getName()); 
                parsingResult.append(">"); 
            } 
        } 
        System.out.println(parsingResult); 
    } 

    private static void writeXMLByStAX() throws XMLStreamException, FileNotFoundException { 
        XMLOutputFactory xmlof = XMLOutputFactory.newInstance(); 
        XMLStreamWriter xmlw = xmlof.createXMLStreamWriter(new FileOutputStream("output.xml")); 

        // 寫入預設的 XML 宣告到xml文件 
        xmlw.writeStartDocument(); 
        xmlw.writeCharacters("\n"); 
        // 寫入註釋到xml文件 
        xmlw.writeComment("testing comment"); 
        xmlw.writeCharacters("\n"); 
        // 寫入一個catalogs根元素 
        xmlw.writeStartElement("catalogs"); 
        xmlw.writeNamespace("myNS""http://blog.csdn.net/China"); 
        xmlw.writeAttribute("owner","China"); 
        xmlw.writeCharacters("\n"); 
        // 寫入子元素catalog 
        xmlw.writeStartElement("http://blog.csdn.net/China""catalog"); 
        xmlw.writeAttribute("id","007"); 
        xmlw.writeCharacters("Apparel"); 
        // 寫入catalog元素的結束標籤 
        xmlw.writeEndElement(); 
        // 寫入catalogs元素的結束標籤 
        xmlw.writeEndElement(); 
        // 結束 XML 文件 
        xmlw.writeEndDocument();         
        xmlw.close(); 
    } 

test.xml檔案內容如下: 

<?xml version="1.0" encoding="UTF-8"?> 
<catalogs> 
    <catalog id="001">Book</catalog> 
    <catalog id="002">Video</catalog> 
</catalogs> 
執行上面程式後,控制檯輸出如下: 

<catalogs> 
    <catalog id="001">Book</catalog> 
    <catalog id="002">Video</catalog> 
</catalogs> 
執行上面程式後,產生的output.xml檔案如下: 

<?xml version="1.0" ?> 
<!-- testing comment--> 
<catalogs xmlns:myNS="http://blog.csdn.net/China" owner="China"
    <myNS:catalog id="007">Apparel</myNS:catalog> 
</catalogs> 
(4) JDK6的新特性之四_使用Compiler API 

現在我們可以用JDK6 的Compiler API(JSR 199)去動態編譯Java原始檔,Compiler API結合反射功能就可以實現動態的產生Java程式碼並編譯執行這些程式碼,有點動態語言的特徵。這個特性對於某些需要用到動態編譯的應用程式相當有用, 比如JSP Web Server,當我們手動修改JSP後,是不希望需要重啟Web Server才可以看到效果的,這時候我們就可以用Compiler API來實現動態編譯JSP檔案,當然,現在的JSP Web Server也是支援JSP熱部署的,現在的JSP Web Server通過在執行期間通過Runtime.exec或ProcessBuilder來呼叫javac來編譯程式碼,這種方式需要我們產生另一個程序去做編譯工作,不夠優雅而且容易使程式碼依賴與特定的作業系統;Compiler API通過一套易用的標準的API提供了更加豐富的方式去做動態編譯,而且是跨平臺的。 下面程式碼演示了Compiler API的使用 

public class CompilerAPITester { 
    private static String JAVA_SOURCE_FILE = "DynamicObject.java"
    private static String JAVA_CLASS_FILE = "DynamicObject.class"
    private static String JAVA_CLASS_NAME = "DynamicObject"
    public static void main(String[] args) { 
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 
        generateJavaClass(); 
        try { 
            //將產生的類檔案拷貝到程式的ClassPath下面,下面這一行程式碼是特定於Windows+IntelliJ IDEA 6.0專案,不具有移植性 
            Runtime.getRuntime().exec("cmd /c copy "+JAVA_CLASS_FILE+" classes\\production\\JDK6Features"); 
            Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(JAVA_SOURCE_FILE); 
            compiler.getTask(null, fileManager, null, null, null, sourcefiles).call(); 
            fileManager.close(); 
            Class.forName(JAVA_CLASS_NAME).newInstance();//建立動態編譯得到的DynamicObject類的例項 
        } catch (Exception ex) { 
            ex.printStackTrace(); 
        } 
    } 

    public static void generateJavaClass(){ 
        try { 
            FileWriter fw = new FileWriter(JAVA_SOURCE_FILE); 
            BufferedWriter bw = new BufferedWriter(fw); 
            bw.write("public class "+JAVA_CLASS_NAME+"{"); 
            bw.newLine(); 
            bw.write("public "+JAVA_CLASS_NAME+"(){System.out.println(\"In the constructor of DynamicObject\");}}"); 
            bw.flush(); 
            bw.close(); 
        } catch (IOException ex) { 
            ex.printStackTrace(); 
        } 
    } 

程式執行後,會產生DynamicObject.java和DynamicObject.class兩個檔案,並在控制檯輸出 

In the constructor of DynamicObject 

(5) JDK6的新特性之五_輕量級HttpServer 

JDK6提供了一個簡單的Http Server API,據此我們可以構建自己的嵌入式Http Server,它支援Http和Https協議,提供了HTTP1.1的部分實現,沒有被實現的那部分可以通過擴充套件已有的Http Server API來實現,程式設計師必須自己實現HttpHandler介面,HttpServer會呼叫HttpHandler實現類的回撥方法來處理客戶端請求,在這裡,我們把一個Http請求和它的響應稱為一個交換,包裝成HttpExchange類,HttpServer負責將HttpExchange傳給HttpHandler實現類的回撥方法.下面程式碼演示了怎樣建立自己的Http Server 

/** 
* Created by IntelliJ IDEA. 
* User: China 
* Date: Dec 30, 2006 
*/
 
public class HTTPServerAPITester { 
    public static void main(String[] args) { 
        try { 
            HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);//設定HttpServer的埠為8888 
            hs.createContext("/china"new MyHandler());//用MyHandler類內處理到/china的請求 
            hs.setExecutor(null); // creates a default executor 
            hs.start(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 


class MyHandler implements HttpHandler { 
   public void handle(HttpExchange t) throws IOException { 
       InputStream is = t.getRequestBody(); 
       String response = "<h3>Happy New Year 2009!--China</h3>"
       t.sendResponseHeaders(200, response.length()); 
       OutputStream os = t.getResponseBody(); 
       os.write(response.getBytes()); 
       os.close(); 
   } 

執行程式後,在瀏覽器內輸入http://localhost:8888/china瀏覽器輸出 

Happy New Year 2007!--China 


(6) JDK6的新特性之六_插入式註解處理API 

插入式註解處理API(JSR 269)提供一套標準API來處理Annotations(JSR 175),實際上JSR 269不僅僅用來處理Annotation,我覺得更強大的功能是它建立了Java 語言本身的一個模型,它把method, package, constructor, type, variable, enum, annotation等Java語言元素對映為Types和Elements(兩者有什麼區別?), 從而將Java語言的語義對映成為物件, 我們可以在javax.lang.model包下面可以看到這些類. 所以我們可以利用JSR 269提供的API來構建一個功能豐富的超程式設計(metaprogramming)環境. JSR 269用Annotation Processor在編譯期間而不是執行期間處理Annotation, Annotation Processor相當於編譯器的一個外掛,所以稱為插入式註解處理.如果Annotation Processor處理Annotation時(執行process方法)產生了新的Java程式碼,編譯器會再呼叫一次Annotation Processor,如果第二次處理還有新程式碼產生,就會接著呼叫Annotation Processor,直到沒有新程式碼產生為止.每執行一次process()方法被稱為一個"round",這樣整個Annotation processing過程可以看作是一個round的序列. JSR 269主要被設計成為針對Tools或者容器的API. 舉個例子,我們想建立一套基於Annotation的單元測試框架(如TestNG),在測試類裡面用Annotation來標識測試期間需要執行的測試方法,如下所示: 

@TestMethod 
public void testCheckName(){ 
       //do something here 

這時我們就可以用JSR 269提供的API來處理測試類,根據Annotation提取出需要執行的測試方法. 

另一個例子是如果我們出於某種原因需要自行開發一個符合Java EE 5.0的Application Server(當然不建議這樣做),我們就必須處理Common Annotations(JSR 250),Web Services Metadata(JSR 181)等規範的Annotations,這時可以用JSR 269提供的API來處理這些Annotations. 在現在的開發工具裡面,Eclipse 3.3承諾將支援JSR 269 

下面我用程式碼演示如何來用JSR 269提供的API來處理Annotations和讀取Java原始檔的元資料(metadata) 

/** 
* Created by IntelliJ IDEA. 
* User: China 
* Date: Dec 31, 2006 
*/
 
@SupportedAnnotationTypes("PluggableAPT.ToBeTested")//可以用"*"表示支援所有Annotations 
@SupportedSourceVersion(SourceVersion.RELEASE_6) 
public class MyAnnotationProcessor extends AbstractProcessor { 
    private void note(String msg) { 
        processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, msg); 
    } 
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
        //annotations的值是通過@SupportedAnnotationTypes宣告的且目標原始碼擁有的所有Annotations 
        for(TypeElement te:annotations){ 
            note("annotation:"+te.toString()); 
        } 
        Set<? extends Element> elements = roundEnv.getRootElements();//獲取原始碼的對映物件 
        for(Element e:elements){ 
            //獲取原始碼物件的成員 
            List<? extends Element> enclosedElems = e.getEnclosedElements(); 
            //留下方法成員,過濾掉其他成員 
            List<? extends ExecutableElement> ees = ElementFilter.methodsIn(enclosedElems); 
            for(ExecutableElement ee:ees){ 
                note("--ExecutableElement name is "+ee.getSimpleName()); 
                List<? extends AnnotationMirror> as 

相關推薦

The Art Of Java ...

JDK6的新特性  JDK6的新特性之一_Desktop類和SystemTray類  JDK6的新特性之二_使用JAXB2來實現物件與XML之間的對映  JDK6的新特性之三_理解StAX  JDK6的新特性之四_使用Compiler API  JDK6的新

Transfer learning & The art of using Pre-trained Models in Deep Learning

tran topic led super entire pooling file under mina 原文網址: https://www.analyticsvidhya.com/blog/2017/06/transfer-learning-the-art-of-fine

【取證分析】The Art of Memory Forensics-Windows取證(Virut樣本取證)

文件 explorer 父進程 所有 ddr png 筆記 特定 sni 1、前言 The Art of Memory Forensics真是一本很棒的書籍,其中使用volatility對內存進行分析的描述可以輔助我們對更高級類的木馬進行分析和取證,這裏對書中的命令進行了筆

the art of seo(chapter five)

port user The IE key disco lmos ase wid Keyword Research***The Theory Behind Keyword Research***1.Understanding the Impact of Google Humm

The art of A/B testing

In particular, I will show:how the Z-test can be applied to testing whether the clients experiencing B spend more time on averagehow the χ² test can be use

Is "Java Concurrency in Practice" still valid in the era of Java 8 and 11?

One of my reader Shobhit asked this question on my blog post about 12 must-reads advanced Java books for intermediate programmers - part1. I really like t

Sprezzatura: The Art Of Making Difficult Things Look Simple

Sprezzatura: The Art Of Making Difficult Things Look SimpleIf there’s one type of person we admire, it’s the person who’s able to get things done without e

Data Science and the Art of Producing Entertainment at Netflix

Data Science and the Art of Producing Entertainment at NetflixNetflix has released hundreds of Originals and plans to spend $8 billion over the next year o

A.I. and the Art of Spotting Fakes

Instead of subjecting works to lengthy and hugely expensive materials analysis, hoping a forger has made a tiny slip — a stray fiber, varnish made using in

The Good and the Bad of Java Programming

Unlike other languages, where you have to use external APIs for distribution, Java offers this technology at its core. Java-specific methodology for distri

雜談 | Why RTOS & The Art Of Coding & Machine Learning & Linux

這裡用來記錄學習路上偶爾一些感想以及大佬分享的一些知識~ 文章目錄 1.Why RTOS 1.1.嵌入式系統軟體 1.1.1.輪詢系統 1.1.2.前後臺系統 1.1.3.多執行緒系統 1.

日誌的藝術(The art of logging)

程式設計師學習每一門語言都是從列印“hello world”開始的,日誌也是新手程式設計師學習、除錯程式的一大利器。當專案上線之後,也會有各種各樣的日誌,比如記錄使用者的行為、伺服器的狀態、異常情況等等。列印日誌似乎是一件很簡單、不值得一提的事情。但是,當看到線上專

Index preview: John Lynn of eero talks IoT and the art of failing fast

John Lynn, Cloud Platform Manager at eero, speaks with IBM content lead Kevin Allen about his role, the work developers at eero are doing in the IoT spa

Hacking: The Art of Exploitation 讀書筆記(一)程式碼除錯技巧

GDB 相關 -q 不列印版本資訊 功能: set disassemble-flavor intel /att 設定彙編語法list:列印程式碼disassemble:反彙編break:設定斷點r

Java compiler level does not match the version of the installed Java project facet

led epo sin eclips path tar repo alt rip 更換jdk版本時報以下問題:Description Resource Path Location TypeJava compiler level does not match the vers

新導入項目出現Java compiler level does not match the version of the installed java project facet問題處理

ima project 編譯 分享 face bsp 導入 ets 操作   在使用eclipse開發java類項目的時候,免不了會在不同的設備上開發編譯同一個項目,那麽就會出現Java compiler level does not match the version o

About the diffrence of wait timed_wait and block in java

@override stack util except str void rgs dex interrupt import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Reentra

Type Java compiler level does not match the version of the installed Java project facet.項目內容沒錯但是項目上報錯,不影響運行

images ems rop http ges 內容 工程 版本 ren 1、Window->Show View->Problems 2、在項目上右鍵properties->project Facets->修改右側的version 保持一致 3

Java問題解決:Java compiler level does not match the version of the installed Java project facet.

問題 compiler .cn 技術分享 cnblogs java編譯 mpi 選中 per 問題原因:Java編譯器級別與Facted Project 中的Java 版本設定不匹配。 解決辦法:將兩者設置一致 1.查看Java compiler level :   選中項

解決java compiler level does not match the version of the installed java project facet

ref 目錄 ngs eclipse 項目 cor 點擊 遇到 log 因為遇到這個問題,所以記錄一下。 轉載自:https://blog.csdn.net/chszs/article/details/8125828 java compiler level does