Java教程 第75页 Java格式 – Java日期格式模式 SimpleDateFormat日期和时间格式由日期和时间模式字符串指定。 在格式字符串中,从“A”到“Z”和从“a”到“z”被视为表示日期或时间字符串的组成部分的格式字母。 文本可以使用单引号(“)引用,以避免解释。“”表示单引号。 所有其他字符不解释并且将被简单地复制到输出字符串中。 模式 定义了以下模式字母: 字母 日期或时间组件 例子 G 时代指示符 AD y 年 2014; 14 Y 周年 2014; 14 M 年份中的月份(上下文相关) July; Jul; 07 L 每年的月份(独立形式) July; Jul; 07 w 每年的一周 27 W 每月一周 2 D 每年的一天 189 d 月份日 10 F 每月的星期几 2 E 周的名称 Tuesday; Tue u 周数(1 =星期一,…,7 =星期日) 1 a Am/pm标记 PM H 时段(1-23) 0 k 时段(1-24) 24 K 上午/下午时间(0-11) 0 h 上午/下午时间(1-12) 12 m 分钟,小时 30 s 第二分钟 55 S 毫秒 978 z 时区 Pacific Standard Time; PST; GMT-08:00 Z 时区 -0800 X 时区 -08; -0800; -08:00 例子 下表有一些示例格式字符串及其结果。 日期和时间模式 结果 "yyyy.MM.dd G "at" HH:mm:ss z" 2014.08.04 AD at 12:08:56 PDT "EEE, MMM d, ""yy" Wed, Jul 4, "01 "h:mm a"...
2024-04-01
Java反射 – Java数组反射 我们可以使用Class类中的isArray()方法来检查类是否是数组。 我们可以创建一个数组,使用反射通过读取和修改其元素的值 java.lang.reflect.Array 类。 Array类的 getLength()方法获取数组的长度。 Array类中的所有方法都是静态的。 要创建数组,请使用Array类中的重载静态方法newInstance()。 Object newInstance(Class<?> componentType, int arrayLength) Object newInstance(Class<?> componentType, int... dimensions) 第一个方法根据指定的组件类型和数组长度创建一个数组。 第二个版本创建指定组件类型和尺寸的数组。 newInstance()方法的返回类型是Object,我们需要将它转换为实际的数组类型。 下面的代码创建一个长度为5的 int 数组。 int[] ids = (int[])Array.newInstance(int.class, 5); 要创建一个维度为5乘3的int数组。 int[][] matrix = (int[][])Array.newInstance(int.class, 5, 3); 例子 以下代码显示了如何动态创建数组并操作其元素。 import java.lang.reflect.Array; public class Main { public static void main(String[] args) { try { Object my = Array.newInstance(int.class, 2); int n1 = Array.getInt(my, 0); int n2 = Array.getInt(my, 1); System.out.println("n1 = " + n1 + ", n2=" + n2); Array.set(my, 0, 11); Array.set(my, 1, 12); n1 = Array.getInt(my, 0); n2 = Array.getInt(my, 1); System.out.println("n1 = " + n1 + ", n2=" + n2); } catch (NegativeArraySizeException | IllegalArgumentException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } } 上面的代码生成以下结果。 获取数组的维度 Java支持array数组。...
2024-04-01
Java反射 – Java反射字段访问 我们可以使用反射在两个步骤中获取或设置字段。 获取字段的引用。 要读取字段的值,请在字段上调用getXxx()方法,其中Xxx是字段的数据类型。 要设置字段的值,请调用相应的setXxx()方法。 以相同的方式访问静态和实例字段。 例子 import java.lang.reflect.Field; class MyClass { public String name = "Unknown"; public MyClass() { } public String toString() { return "name=" + this.name; } } public class Main { public static void main(String[] args) { Class<MyClass> ppClass = MyClass.class; try { MyClass p = ppClass.newInstance(); Field name = ppClass.getField("name"); String nameValue = (String) name.get(p); System.out.println("Current name is " + nameValue); name.set(p, "abc"); nameValue = (String) name.get(p); System.out.println("New name is " + nameValue); } catch (InstantiationException | IllegalAccessException | NoSuchFieldException | SecurityException | IllegalArgumentException e) { System.out.println(e.getMessage()); } } } 上面的代码生成以下结果。 绕过辅助功能检查 使用反射访问类的非可访问字段,方法和构造函数从 AccessibleObject 类调用 setAccessible(boolean flag)方法。 我们需要使用true参数调用此方法,以使该字段,方法和构造函数可访问。 import java.lang.reflect.Field; class MyClass { private String name = "Unknown"; public MyClass() { } public...
2024-04-01
Java反射 – Java反射对象创建 我们可以使用反射动态创建类的对象。通过调用其中一个构造函数。 然后我们可以访问对象的字段的值,设置它们的值,并调用它们的方法。 有两种方法来创建对象: 使用no-args构造函数 使用带参数的构造函数 无参数构造函数 如果你有一个 Class 对象的引用,你可以创建一个对象该类对Class类使用 newInstance()方法。 此方法不使用参数,并且是等效的使用new运算符的类的no-args构造函数。 MyClass m = myObject.newInstance(); class MyClass { public MyClass() { System.out.println("called"); } } public class Main { public static void main(String[] args) throws InstantiationException { Class<MyClass> personClass = MyClass.class; try { MyClass p = personClass.newInstance(); System.out.println(p); } catch (InstantiationException | IllegalAccessException e) { System.out.println(e.getMessage()); } } } 上面的代码生成以下结果。 带参数的构造函数 您可以通过调用特定的构造函数使用反射创建对象。它涉及两个步骤。 获取构造函数的实例 调用newInstance来调用它 你可以得到这个构造函数的引用,如图所示: Constructor<MyClass> cons = myClass.getConstructor(int.class, String.class); 然后调用带有参数的 newInstance()方法来创建一个对象。 import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; class MyClass { public MyClass(int i, String s) { System.out.println("called"); System.out.println(i); System.out.println(s); } } public class Main { public static void main(String[] args) { Class<MyClass> myClass = MyClass.class; try { Constructor<MyClass> cons = myClass.getConstructor(int.class, String.class); MyClass chris = cons.newInstance(1, "abc"); System.out.println(chris); }...
2024-04-01
Java反射 – Java构造函数反射 以下四种方法来自 Class 类获取有关构造函数的信息: Constructor[] getConstructors() Constructor[] getDeclaredConstructors() Constructor<T> getConstructor(Class... parameterTypes) Constructor<T> getDeclaredConstructor(Class... parameterTypes) getConstructors()方法返回当前和超类的所有公共构造函数。 getDeclaredConstructors()方法返回当前类的所有声明的构造函数。 getConstructor(Class … parameterTypes)和getDeclaredConstructor(Class … parameterTypes)通过参数类型获取构造函数对象。 例子 以下代码显示了如何对构造函数执行反射。 import java.lang.reflect.Constructor; import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Parameter; import java.util.ArrayList; class MyClass<T> { public MyClass(int i, int j, String s) { } public MyClass(T t) { } public int getInt(String a) { return 0; } } public class Main { public static void main(String[] args) { Class<MyClass> c = MyClass.class; System.out.println("Constructors for " + c.getName()); Constructor[] constructors = c.getConstructors(); ArrayList<String> constructDescList = getConstructorsDesciption(constructors); for (String desc : constructDescList) { System.out.println(desc); } } public static ArrayList<String> getConstructorsDesciption( Constructor[] constructors) { ArrayList<String> constructorList = new ArrayList<>(); for (Constructor constructor : constructors) { String modifiers =...
2024-04-01
Java反射 – Java字段反射 我们可以使用java.lang.reflect.Field类来获取关于类中的字段的信息。 以下四种方法在Class类可以返回关于字段的 Field 对象。 Field[] getFields() Field[] getDeclaredFields() Field getField(String name) Field getDeclaredField(String name) getFields()方法返回所有可访问的公共字段在类中声明或继承自超类。 getDeclaredFields()方法返回所有字段只出现在类的声明中(不是从继承的字段)。 getField(String name)和 getDeclaredField(String name)通过字段名获取 Field 对象。 例子 import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; class MySuperClass { public int super_id = -1; public String super_name = "Unknown"; } class MyClass extends MySuperClass{ public int id = -1; public String name = "Unknown"; } public class Main { public static void main(String[] args) { Class<MyClass> c = MyClass.class; // Print declared fields ArrayList<String> fieldsDesciption = getDeclaredFieldsList(c); System.out.println("Declared Fields for " + c.getName()); for (String desc : fieldsDesciption) { System.out.println(desc); } fieldsDesciption = getFieldsList(c); System.out.println("\nAccessible Fields for " + c.getName()); for (String desc : fieldsDesciption) { System.out.println(desc); } } public static ArrayList<String> getFieldsList(Class c)...
2024-04-01
Java反射 – Java类反射 我们可以使用Java反射来获取关于类的信息,例如作为其包名称,其访问修饰符等。 要获得简单的类名,请使用 Class 中的 getSimpleName()方法。 String simpleName = c.getSimpleName(); 类的修饰符是关键字之前的关键字类在类声明中,如 abstract , public 。 Class 中的 getModifiers()方法返回类的所有修饰符。 getModifiers()方法返回一个整数。我们必须调用 java.lang.reflect.Modifier.toString(int modifiers)以获得修饰符的文本形式。 要获取超类的名称,请使用 Class 中的 getSuperclass()方法。 如果对Object类调用getSuperclass()方法,它将返回null,因为它没有超类。 要获取类实现的所有接口的名称,请使用 getInterfaces()。 Class[] interfaces = c.getInterfaces(); 例子 import java.io.Serializable; import java.lang.reflect.Modifier; import java.lang.reflect.TypeVariable; class MyClass<T> implements Cloneable, Serializable { private int id = -1; private String name = "Unknown"; public MyClass(int id, String name) { this.id = id; this.name = name; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e.getMessage()); } } public String toString() { return "MyClass: id=" + this.id + ", name=" + this.name; } } public class Main { public static void main(String[] args) { // Print the class declaration for...
2024-04-01
Java XML教程 – Java StAX StAX是为了解决SAX和DOM API中的限制而创建的。 StAX API允许我们请求下一个事件(拉动事件),并允许状态以过程方式存储。 XML解析有两种编程模型:流和文档对象模型(DOM)。 DOM模型涉及创建表示整个文档树的内存对象。DOM树可以自由导航。 成本是一个大的内存占用。这对于小文档来说是可以的,但是当文档变得更大时,内存消耗可能会迅速上升。 流是指其中XML数据被串行解析的编程模型。在文档中,我们只能在一个位置查看XML数据。这意味着我们需要在读取XML文档之前知道XML结构。用于XML处理的流模型在存在内存限制时很有用。 拉式解析vs推式解析 当我们想获取(拉取)XML数据时,我们做流式拉解析。 当解析器发送数据时,无论客户端是否准备好使用它,我们都进行流式推送解析。 StAX拉解析器可以过滤XML文档并忽略元素不必要。 StAX是一个双向API,通过它我们可以读取和写入XML文档。 SAX是只读的。 SAX是一个推送API,而StAX是拉式。 例子 此程序演示如何使用StAX解析器。它打印XHTML网页的所有超链接链接。 import java.io.InputStream; import java.net.URL; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; public class Main { public static void main(String[] args) throws Exception { URL url = new URL("http://www.w3c.org"); InputStream in = url.openStream(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader parser = factory.createXMLStreamReader(in); while (parser.hasNext()) { int event = parser.next(); if (event == XMLStreamConstants.START_ELEMENT) { if (parser.getLocalName().equals("a")) { String href = parser.getAttributeValue(null, "href"); if (href != null) System.out.println(href); } } } } } 例2 下面的代码显示了如何使用XML流读取器加载XML文档。 import java.io.File; import java.io.FileInputStream; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; public class Main { public static void main(String[] args) throws Exception { File file =...
2024-04-01
Java XML教程 – Java XSLT 可扩展样式表语言转换(XSLT)标准定义类,用于使用XPath寻址XML数据和进行转换数据以其他形式。 JAXP包括XSLT的解释实现。 XSL,XSLT和XPath 可扩展样式表语言(XSL)有三个主要子组件: 组件 描述 XSL-FO 格式化对象标准。 我们可以定义字体大小,页面布局和对象呈现的其他方面。 XSLT 它定义了从XML到其他格式的转换。例如,使用XSLT从XML文档生成HTML。 XPath XPath是一种规范语言,我们可以用它来创建一个元素的路径。 JAXP转换包 以下是对JAXP Transformation API的包的描述: 包 描述 javax.xml.transform 这个包定义了返回Transformer对象的工厂类。 我们可以使用输入和输出对象配置Transformer,并调用其transform()方法来执行转换。 javax.xml.transform.dom 定义DOMSource和DOMResult类,用于将DOM用作转换中的输入或输出。 javax.xml.transform.sax 定义SAXSource和SAXResult类,用于在转换中使用SAX作为输入或输出。 javax.xml.transform.stream 定义StreamSource和StreamResult类,以将I/O流用作转换的输入或输出。 XPath表达式指定用于选择一组XML节点的模式。 XSLT模板可以使用这些模式来选择节点并应用转换。 使用XPath表达式,我们可以引用元素的文本和属性。XPath规范定义了七种类型的节点: 根 元素 文本 属性 注释 处理指令 命名空间 XPath寻址 XML文档是树结构的节点集合。 XPath使用路径符号在XML中寻址节点。 正斜杠/是路径分隔符。 文档根目录的绝对路径以/开头。 相对路径可以从任何其他开始。 双重周期..表示父节点。 单个期间.表示当前节点。 在XPath /h1/h2 中选择位于h1元素下的所有h2元素。 要选择一个特定的h2元素,我们使用方括号 [] 来索引。 例如, /h1[4]/h2 [5] 将选择第五个 h2 在第四个 h1 元素下。 要引用属性,请在属性名称前加上@符号。例如, @type 是指 type 属性。 h1/@type选择 h1 元素的 type 属性。 XPath表达式 XPath表达式可以使用通配符,运算符及其自身的函数。 表达式 @type="unordered"指定一个属性名为 type ,其值为无序。 表达式 h1[@ type="unordered"] 选择所有 h1 元素其 type 属性值是无序的。 例子 假设我们将电话数据存储在以下XML文档中。 <PHONEBOOK> <PERSON> <NAME>Joe Wang</NAME> <EMAIL>joe@yourserver.com</EMAIL> <TELEPHONE>202-999-9999</TELEPHONE> <WEB>www.w3cschool.cn</WEB> </PERSON> <PERSON> <NAME>Karol</name> <EMAIL>karol@yourserver.com</EMAIL> <TELEPHONE>306-999-9999</TELEPHONE> <WEB>www.w3cschool.cn</WEB> </PERSON> <PERSON> <NAME>Green</NAME> <EMAIL>green@yourserver.com</EMAIL> <TELEPHONE>202-414-9999</TELEPHONE> <WEB>www.w3cschool.cn</WEB> </PERSON> </PHONEBOOK> 我们将使用以下XSLT将上述XML转换为HTML文件。 <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/">...
2024-04-01
Java XML教程 – Java DOM编辑 属性 以下代码显示如何向元素添加属性。 import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; public class Main { public static void main(String[] argv) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument(null, null, null); Element e1 = doc.createElement("api"); doc.appendChild(e1); Element e2 = doc.createElement("java"); e1.appendChild(e2); e2.setAttribute("url", "http://www.www.w3cschool.cn"); //transform the DOM for showing the result in console DOMSource domSource = new DOMSource(doc); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter sw = new StringWriter(); StreamResult sr = new StreamResult(sw); transformer.transform(domSource, sr); System.out.println(sw.toString()); } } 上面的代码生成以下结果。 复制属性 public void dupAttributes(Document doc)...
2024-04-01