??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美黄色免费网站,欧美亚洲国产精品,亚洲青青久久http://www.aygfsteel.com/freefly/category/18857.html一门技术,如果不能讲出来,那么是没有理解Q如果不能很好的讲出?那么是理解不够透彻Q?/description>zh-cnThu, 22 May 2008 21:53:10 GMTThu, 22 May 2008 21:53:10 GMT60使用javamail发信q程中的一些问题及解决Ҏhttp://www.aygfsteel.com/freefly/articles/202293.htmlfreeflyfreeflyThu, 22 May 2008 17:28:00 GMThttp://www.aygfsteel.com/freefly/articles/202293.htmlhttp://www.aygfsteel.com/freefly/comments/202293.htmlhttp://www.aygfsteel.com/freefly/articles/202293.html#Feedback0http://www.aygfsteel.com/freefly/comments/commentRss/202293.htmlhttp://www.aygfsteel.com/freefly/services/trackbacks/202293.html文章来源?http://www.aygfsteel.com/TrampEagle/archive/2006/05/26/48326.html

今天在研Ijavamail发信的过E中Q出C一些小问题Q现ȝ如下Q以免后来者走些不必要的弯路,先把完整的能够正常运行的代码CZ_脓如下Q?br /> 发邮件源代码Q?br /> package com.hyq.test;

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class MailExample {

  public static void main (String args[]) throws Exception {
   
    String host = "smtp.163.com";   //发gZ用发邮g的电子信服务器
    String from = "你自q电子信箱";    //发邮件的出发圎ͼ发g人的信箱Q?br />     String to = "收gZ?;   //发邮件的目的圎ͼ收gZ)

    // Get system properties
    Properties props = System.getProperties();

    // Setup mail server
    props.put("mail.smtp.host", host);

    // Get session
    props.put("mail.smtp.auth", "true"); //q样才能通过验证

    MyAuthenticator myauth = new MyAuthenticator("你自q电子信箱", "你自q信箱密码");
    Session session = Session.getDefaultInstance(props, myauth);

//    session.setDebug(true);

    // Define message
    MimeMessage message = new MimeMessage(session);
   

    // Set the from address
    message.setFrom(new InternetAddress(from));

    // Set the to address
    message.addRecipient(Message.RecipientType.TO,
      new InternetAddress(to));

    // Set the subject
    message.setSubject("试E序Q?);

    // Set the content
    message.setText("q是用java写的发送电子邮件的试E序Q?);

    message.saveChanges();

      Transport.send(message);
    
  }
}

校验发信人权限的Ҏ
package com.hyq.test;

import javax.mail.PasswordAuthentication;

class MyAuthenticator
      extends javax.mail.Authenticator {
    private String strUser;
    private String strPwd;
    public MyAuthenticator(String user, String password) {
      this.strUser = user;
      this.strPwd = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(strUser, strPwd);
    }
  }


注意Q上面的事例仅ؓ使用163信箱时发送电子邮件的ҎQ因Z用的host为:smtp.163.comQ如源代码中QString host = "smtp.163.com";   //发gZ用发邮g的电子信服务器Q如果用其它的电子邮g发送,必d光件服务器上查扄应的电子邮g服务器,例如搜狐p使用smtp.sohu.comQ具体情况具体对待,都可以从所使用的邮件服务器上获得的。如果没有用host Q也是_没有q行props.put("mail.smtp.host", host);讄Q那么就会抛javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;的异常。当然了Q如果你没有正确配置Q这个异总然会被抛出的?br />
有些邮g服务pȝ是不需要验证发件h的授权的Q所以可以很单的使用
    Session session = Session.getDefaultInstance(props, null);
             而不必?br />     props.put("mail.smtp.auth", "true"); 
    MyAuthenticator myauth = new MyAuthenticator("你自q电子信箱", "你自q信箱密码");
    Session session = Session.getDefaultInstance(props, myauth);

可以发送电子邮件了Q这个多Z些企事业单位的内部电子信ql?br /> 但是对于很多门户|站上的电邮pȝQ如:163,sohu,yahoo{等Q如果仍然简单的q样使用׃?br />
com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxuAyCAfmnZE8BwtIA==.32705S2


 at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

 at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

 at javax.mail.Transport.send0(Transport.java:169)

 at javax.mail.Transport.send(Transport.java:98)

q样的异常,要求你必进行授权校验,它的目的是L他hL乱发邮gQ也是Z减少垃圾邮g的出现吧。这时候,我们p使用
    props.put("mail.smtp.auth", "true"); 
    MyAuthenticator myauth = new MyAuthenticator("你自q电子信箱", "你自q信箱密码");
    Session session = Session.getDefaultInstance(props, myauth);

q里q有一个特别注意的事情Q在你用Session.getDefaultInstanceӞ一定要?nbsp;   props.put("mail.smtp.auth", "true"); |ؓtrue,它默认的是false,如果你没有做q一步,虽然你用了Session.getDefaultInstance(props, myauth);Q你自己也确?nbsp;   MyAuthenticator myauth = new MyAuthenticator("你自q电子信箱", "你自q信箱密码");但是它仍然会抛出
com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required,smtp8,wKjADxJA2SBrm3ZEFv0gIA==.40815S2


 at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

 at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

 at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

 at javax.mail.Transport.send0(Transport.java:169)

 at javax.mail.Transport.send(Transport.java:98)
q样的异常。我在q一步费了好长时_后来才发Cq个问题Q很是郁闗不q还好,ȝ解决了?br />
其实上面的做法只是比较简单的一U,也有很多其它的写法,如:
Properties props = System.getProperties();可以使用
Properties props = new Properties();来代ѝ?br />

Transport.send(message);可以使用下面的代码来代替
      String username = "你的电子信箱用户?;
      String password = "你的电子信箱密码";
      message.saveChanges(); //    implicit with send()
      Transport transport = session.getTransport("smtp");
      transport.connect("mail.htf.com.cn", username, password);
      transport.sendMessage(message, message.getAllRecipients());
      transport.close();
q种Ҏ在同时发送多电子邮件时比较有用?br />
q有一些具体的相关概念Q可以查看相关的官方文档Q在我查询资料时Q发C一文章写得相当仔l,可以加以参考:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html

另附上用org.apache.commons.mailq行发电子邮件的CZQ?br /> import org.apache.commons.mail.SimpleEmail;
import org.apache.commons.mail.*;

public class TestCommon {
  public TestCommon() {
  }
  public static void main(String[] args){
    SimpleEmail email = new SimpleEmail();
    email.setHostName("smtp.163.com");//讄使用发电子邮件的邮g服务?br />     try {
      email.addTo("收gZ?/a>");
      email.setAuthentication("
发gZ?,"发gZ密?/a>");
      email.setFrom("
发gZ?/a>");
      email.setSubject("Test apache.commons.mail message");
      email.setMsg("This is a simple test of commons-email");
      email.send();
    }
    catch (EmailException ex) {
      ex.printStackTrace();
    }
  }
}



freefly 2008-05-23 01:28 发表评论
]]>
java反射机制的简单例?/title><link>http://www.aygfsteel.com/freefly/articles/161971.html</link><dc:creator>freefly</dc:creator><author>freefly</author><pubDate>Tue, 20 Nov 2007 15:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/freefly/articles/161971.html</guid><wfw:comment>http://www.aygfsteel.com/freefly/comments/161971.html</wfw:comment><comments>http://www.aygfsteel.com/freefly/articles/161971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freefly/comments/commentRss/161971.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freefly/services/trackbacks/161971.html</trackback:ping><description><![CDATA[Java 的反机制是使其h动态特性的非常关键的一U机Ӟ也是在JavaBean 中广泛应用的一U特性?<br /> q用JavaBean 的最常见的问题是Q根据指定的cdQ类字段名和所对应的数据,得到该类的实例,下面的一个例子演CZq一实现?<br /> -|Base.java //抽象基类 <br /> |Son1.java //基类扩展1 <br /> |Son2.java //基类扩展2 <br /> |Util.java <br /> /** <br /> * @author metaphy <br /> * create 2005-4-14 9:06:56 <br /> * 说明Q?<br /> */ <br /> Q?QBase.java 抽象基类只是一个定?<br /> public abstract class Base { <br /> } <br /> Q?QSon1.java /Son2.java 是已l实现的JavaBean <br /> public class Son1 extends Base{ <br /> private int id ; <br /> private String name ; <br /> <br /> public int getId() { <br /> return id; <br /> } <br /> public void setId(int id) { <br /> this.id = id; <br /> } <br /> public String getName() { <br /> return name; <br /> } <br /> public void setName(String name) { <br /> this.name = name; <br /> } <br /> <br /> public void son1Method(String s){ <br /> System.out.println(s) ; <br /> } <br /> } <br /> Q?Q?<br /> public class Son2 extends Base{ <br /> private int id; <br /> private double salary; <br /> <br /> public int getId() { <br /> return id; <br /> } <br /> public void setId(int id) { <br /> this.id = id; <br /> } <br /> public double getSalary() { <br /> return salary; <br /> } <br /> public void setSalary(double salary) { <br /> this.salary = salary; <br /> } <br /> } <br /> Q?QUtil.java 演示了如何根据指定的cdQ类字段名和所对应的数据,得到一个类的实?<br /> import java.lang.reflect.Method; <br /> public class Util { <br /> //此方法的最大好处是没有cdSon1,Son2 可以通过参数来指定,E序里面Ҏ不用出现 <br /> public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){ <br /> Base base = null ; <br /> try { <br /> Class cls = Class.forName(beanName) ; <br /> base = (Base)cls.newInstance() ; <br /> Class[] paraTypes = new Class[]{String.class }; <br /> Method method = cls.getMethod(fieldSetter, paraTypes) ; <br /> String[] paraValues = new String[]{paraValue} ; <br /> method.invoke(base, paraValues) ; <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> return base ; <br /> } <br /> <br /> <br /> public static void main(String[] args){ <br /> Son1 son1 =(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha"); <br /> System.out.println("son1.getName() :"+son1.getName()) ; <br /> } <br /> } <br /> //调用l果Q?<br /> //son1.getName() :wang da sha <br /> <br /> 谢谢Q希望能l大家一点启发! <br /> Q-Q-Q-Q-Q-Q-Q-Q-Q-Q- <br /> 附: <br /> //下面q篇文档来源于InternetQ作者不?<br /> Reflection ?Java E序开发语a的特征之一Q它允许q行中的 Java E序对自w进行检查,或者说“自审”Qƈ能直接操作程序的内部属性。例如,使用它能获得 Java cM各成员的名称q显C出来?<br /> Java 的这一能力在实际应用中也许用得不是很多Q但是在其它的程序设计语a中根本就不存在这一Ҏ。例如,Pascal、C 或?C++ 中就没有办法在程序中获得函数定义相关的信息?<br /> JavaBean ?reflection 的实际应用之一Q它能让一些工具可视化的操作Y件组件。这些工具通过 reflection 动态的载入q取?Java lg(c? 的属性?<br /> 1. 一个简单的例子 <br /> 考虑下面q个单的例子Q让我们看看 reflection 是如何工作的?<br /> import java.lang.reflect.*; <br /> public class DumpMethods { <br /> public static void main(String args[]) { <br /> try { <br /> Class c = Class.forName(args[0]); <br /> Method m[] = c.getDeclaredMethods(); <br /> for (int i = 0; i < m.length; i++) <br /> System.out.println(m[i].toString()); <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> 按如下语句执行: <br /> java DumpMethods java.util.Stack <br /> 它的l果输出为: <br /> public java.lang.Object java.util.Stack.push(java.lang.Object) <br /> public synchronized java.lang.Object java.util.Stack.pop() <br /> public synchronized java.lang.Object java.util.Stack.peek() <br /> public boolean java.util.Stack.empty() <br /> public synchronized int java.util.Stack.search(java.lang.Object) <br /> q样列Zjava.util.Stack cȝ各方法名以及它们的限制符和返回类型?<br /> q个E序使用 Class.forName 载入指定的类Q然后调?getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描q某个类中单个方法的一个类?<br /> 2.开始?Reflection <br /> 用于 reflection 的类Q如 MethodQ可以在 java.lang.relfect 包中扑ֈ。用这些类的时候必要遵@三个步骤Q第一步是获得你想操作的类?java.lang.Class 对象。在q行中的 Java E序中,?java.lang.Class cL描述cd接口{?<br /> 下面是获得一?Class 对象的方法之一Q?<br /> Class c = Class.forName("java.lang.String"); <br /> q条语句得到一?String cȝcd象。还有另一U方法,如下面的语句Q?<br /> Class c = int.class; <br /> 或?<br /> Class c = Integer.TYPE; <br /> 它们可获得基本类型的cM息。其中后一U方法中讉K的是基本cd的封装类 (?Integer) 中预先定义好?TYPE 字段?<br /> W二步是调用诸如 getDeclaredMethods 的方法,以取得该cM定义的所有方法的列表?<br /> 一旦取得这个信息,可以进行第三步了——?reflection API 来操作这些信息,如下面这D代码: <br /> Class c = Class.forName("java.lang.String"); <br /> Method m[] = c.getDeclaredMethods(); <br /> System.out.println(m[0].toString()); <br /> 它将以文本方式打印出 String 中定义的W一个方法的原型?<br /> 在下面的例子中,q三个步骤将Z?reflection 处理Ҏ应用E序提供例证?<br /> 模拟 instanceof 操作W?<br /> 得到cM息之后,通常下一个步骤就是解军_?Class 对象的一些基本的问题。例如,Class.isInstance Ҏ可以用于模拟 instanceof 操作W: <br /> class A { <br /> } <br /> public class instance1 { <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("A"); <br /> boolean b1 = cls.isInstance(new Integer(37)); <br /> System.out.println(b1); <br /> boolean b2 = cls.isInstance(new A()); <br /> System.out.println(b2); <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> 在这个例子中创徏了一?A cȝ Class 对象Q然后检查一些对象是否是 A 的实例。Integer(37) 不是Q但 new A() 是?<br /> 3.扑ևcȝҎ <br /> 扑և一个类中定义了些什么方法,q是一个非常有价g非常基础?reflection 用法。下面的代码实Cq一用法Q?<br /> import java.lang.reflect.*; <br /> public class method1 { <br /> private int f1(Object p, int x) throws NullPointerException { <br /> if (p == null) <br /> throw new NullPointerException(); <br /> return x; <br /> } <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("method1"); <br /> Method methlist[] = cls.getDeclaredMethods(); <br /> for (int i = 0; i < methlist.length; i++) { <br /> Method m = methlist[i]; <br /> System.out.println("name = " + m.getName()); <br /> System.out.println("decl class = " + m.getDeclaringClass()); <br /> Class pvec[] = m.getParameterTypes(); <br /> for (int j = 0; j < pvec.length; j++) <br /> System.out.println("param #" + j + " " + pvec[j]); <br /> Class evec[] = m.getExceptionTypes(); <br /> for (int j = 0; j < evec.length; j++) <br /> System.out.println("exc #" + j + " " + evec[j]); <br /> System.out.println("return type = " + m.getReturnType()); <br /> System.out.println("-----"); <br /> } <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> q个E序首先取得 method1 cȝ描述Q然后调?getDeclaredMethods 来获取一pd?Method 对象Q它们分别描qC定义在类中的每一个方法,包括 public Ҏ、protected Ҏ、package Ҏ?private Ҏ{。如果你在程序中使用 getMethods 来代?getDeclaredMethodsQ你q能获得l承来的各个Ҏ的信息?<br /> 取得?Method 对象列表之后Q要昄q些Ҏ的参数类型、异常类型和q回值类型等׃难了。这些类型是基本cdq是cȝ型,都可以由描述cȝ对象按顺序给出?<br /> 输出的结果如下: <br /> name = f1 <br /> decl class = class method1 <br /> param #0 class java.lang.Object <br /> param #1 int <br /> exc #0 class java.lang.NullPointerException <br /> return type = int <br /> ----- <br /> name = main <br /> decl class = class method1 <br /> param #0 class [Ljava.lang.String; <br /> return type = void <br /> ----- <br /> <br /> 4.获取构造器信息 <br /> 获取cL造器的用法与上述获取Ҏ的用法类|如: <br /> import java.lang.reflect.*; <br /> public class constructor1 { <br /> public constructor1() { <br /> } <br /> protected constructor1(int i, double d) { <br /> } <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("constructor1"); <br /> Constructor ctorlist[] = cls.getDeclaredConstructors(); <br /> for (int i = 0; i < ctorlist.length; i++) { <br /> Constructor ct = ctorlist[i]; <br /> System.out.println("name = " + ct.getName()); <br /> System.out.println("decl class = " + ct.getDeclaringClass()); <br /> Class pvec[] = ct.getParameterTypes(); <br /> for (int j = 0; j < pvec.length; j++) <br /> System.out.println("param #" + j + " " + pvec[j]); <br /> Class evec[] = ct.getExceptionTypes(); <br /> for (int j = 0; j < evec.length; j++) <br /> System.out.println("exc #" + j + " " + evec[j]); <br /> System.out.println("-----"); <br /> } <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> q个例子中没能获得返回类型的相关信息Q那是因为构造器没有q回cd?<br /> q个E序q行的结果是Q?<br /> name = constructor1 <br /> decl class = class constructor1 <br /> ----- <br /> name = constructor1 <br /> decl class = class constructor1 <br /> param #0 int <br /> param #1 double <br /> ----- <br /> 5.获取cȝ字段(? <br /> 扑և一个类中定义了哪些数据字段也是可能的,下面的代码就在干q个事情Q?<br /> <br /> import java.lang.reflect.*; <br /> public class field1 { <br /> private double d; <br /> public static final int i = 37; <br /> String s = "testing"; <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("field1"); <br /> Field fieldlist[] = cls.getDeclaredFields(); <br /> for (int i = 0; i < fieldlist.length; i++) { <br /> Field fld = fieldlist[i]; <br /> System.out.println("name = " + fld.getName()); <br /> System.out.println("decl class = " + fld.getDeclaringClass()); <br /> System.out.println("type = " + fld.getType()); <br /> int mod = fld.getModifiers(); <br /> System.out.println("modifiers = " + Modifier.toString(mod)); <br /> System.out.println("-----"); <br /> } <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> q个例子和前面那个例子非常相伹{例中用了一个新东西 ModifierQ它也是一?reflection c,用来描述字段成员的修饰语Q如“private int”。这些修饰语自n由整数描qͼ而且使用 Modifier.toString 来返回以“官方”序排列的字W串描述 (?#8220;static”?#8220;final”之前)。这个程序的输出是: <br /> name = d <br /> decl class = class field1 <br /> type = double <br /> modifiers = private <br /> ----- <br /> name = i <br /> decl class = class field1 <br /> type = int <br /> modifiers = public static final <br /> ----- <br /> name = s <br /> decl class = class field1 <br /> type = class java.lang.String <br /> modifiers = <br /> ----- <br /> 和获取方法的情况一下,获取字段的时候也可以只取得在当前cMx了的字段信息 (getDeclaredFields)Q或者也可以取得父类中定义的字段 (getFields) ?<br /> <br /> 6.ҎҎ的名U来执行Ҏ <br /> 文本到这里,所丄例子无一例外都与如何获取cȝ信息有关。我们也可以?reflection 来做一些其它的事情Q比如执行一个指定了名称的方法。下面的CZ演示了这一操作Q?<br /> import java.lang.reflect.*; <br /> public class method2 { <br /> public int add(int a, int b) { <br /> return a + b; <br /> } <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("method2"); <br /> Class partypes[] = new Class[2]; <br /> partypes[0] = Integer.TYPE; <br /> partypes[1] = Integer.TYPE; <br /> Method meth = cls.getMethod("add", partypes); <br /> method2 methobj = new method2(); <br /> Object arglist[] = new Object[2]; <br /> arglist[0] = new Integer(37); <br /> arglist[1] = new Integer(47); <br /> Object retobj = meth.invoke(methobj, arglist); <br /> Integer retval = (Integer) retobj; <br /> System.out.println(retval.intvalue()); <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> 假如一个程序在执行的某处的时候才知道需要执行某个方法,q个Ҏ的名U是在程序的q行q程中指定的 (例如QJavaBean 开发环境中׃做这L?Q那么上面的E序演示了如何做到?<br /> 上例中,getMethod 用于查找一个具有两个整型参C名ؓ add 的方法。找到该Ҏq创Z相应?Method 对象之后Q在正确的对象实例中执行它。执行该Ҏ的时候,需要提供一个参数列表,q在上例中是分别包装了整?37 ?47 的两?Integer 对象。执行方法的q回的同h一?Integer 对象Q它装了返回?84?<br /> 7.创徏新的对象 <br /> 对于构造器Q则不能像执行方法那栯行,因ؓ执行一个构造器意味着创徏了一个新的对?(准确的说Q创Z个对象的q程包括分配内存和构造对?。所以,与上例最怼的例子如下: <br /> import java.lang.reflect.*; <br /> public class constructor2 { <br /> public constructor2() { <br /> } <br /> public constructor2(int a, int b) { <br /> System.out.println("a = " + a + " b = " + b); <br /> } <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("constructor2"); <br /> Class partypes[] = new Class[2]; <br /> partypes[0] = Integer.TYPE; <br /> partypes[1] = Integer.TYPE; <br /> Constructor ct = cls.getConstructor(partypes); <br /> Object arglist[] = new Object[2]; <br /> arglist[0] = new Integer(37); <br /> arglist[1] = new Integer(47); <br /> Object retobj = ct.newInstance(arglist); <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> Ҏ指定的参数类型找到相应的构造函数ƈ执行它,以创Z个新的对象实例。用这U方法可以在E序q行时动态地创徏对象Q而不是在~译的时候创建对象,q一炚w常有价倹{?<br /> 8.改变字段(?的?<br /> reflection 的还有一个用处就是改变对象数据字D늚倹{reflection 可以从正在运行的E序中根据名U找到对象的字段q改变它Q下面的例子可以说明q一点: <br /> import java.lang.reflect.*; <br /> public class field2 { <br /> public double d; <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("field2"); <br /> Field fld = cls.getField("d"); <br /> field2 f2obj = new field2(); <br /> System.out.println("d = " + f2obj.d); <br /> fld.setDouble(f2obj, 12.34); <br /> System.out.println("d = " + f2obj.d); <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> q个例子中,字段 d 的D变ؓ?12.34?<br /> 9.使用数组 <br /> 本文介绍?reflection 的最后一U用法是创徏的操作数l。数l在 Java 语言中是一U特D的cȝ型,一个数l的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的: <br /> import java.lang.reflect.*; <br /> public class array1 { <br /> public static void main(String args[]) { <br /> try { <br /> Class cls = Class.forName("java.lang.String"); <br /> Object arr = Array.newInstance(cls, 10); <br /> Array.set(arr, 5, "this is a test"); <br /> String s = (String) Array.get(arr, 5); <br /> System.out.println(s); <br /> } catch (Throwable e) { <br /> System.err.println(e); <br /> } <br /> } <br /> } <br /> 例中创徏?10 个单位长度的 String 数组QؓW?5 个位|的字符串赋了|最后将q个字符串从数组中取得ƈ打印了出来?<br /> 下面q段代码提供了一个更复杂的例子: <br /> import java.lang.reflect.*; <br /> public class array2 { <br /> public static void main(String args[]) { <br /> int dims[] = new int[]{5, 10, 15}; <br /> Object arr = Array.newInstance(Integer.TYPE, dims); <br /> Object arrobj = Array.get(arr, 3); <br /> Class cls = arrobj.getClass().getComponentType(); <br /> System.out.println(cls); <br /> arrobj = Array.get(arrobj, 5); <br /> Array.setInt(arrobj, 10, 37); <br /> int arrcast[][][] = (int[][][]) arr; <br /> System.out.println(arrcast[3][5][10]); <br /> } <br /> } <br /> 例中创徏了一?5 x 10 x 15 的整型数l,qؓ处于 [3][5][10] 的元素赋了gؓ 37。注意,多维数组实际上就是数l的数组Q例如,W一?Array.get 之后Qarrobj 是一?10 x 15 的数l。进而取得其中的一个元素,即长度ؓ 15 的数l,q?Array.setInt 为它的第 10 个元素赋倹{?<br /> 注意创徏数组时的cd是动态的Q在~译时ƈ不知道其cd?/ca><br /> <img src ="http://www.aygfsteel.com/freefly/aggbug/161971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freefly/" target="_blank">freefly</a> 2007-11-20 23:28 <a href="http://www.aygfsteel.com/freefly/articles/161971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȫ</a>| <a href="http://" target="_blank">ϰ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ױ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">罭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ʊ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">䶨</a>| <a href="http://" target="_blank">ׯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>