黑马程序员技术交流社区

标题: 反射一个类的构造函数和方法,出错了,求解决啊~! [打印本页]

作者: 张小庆    时间: 2012-4-28 19:07
标题: 反射一个类的构造函数和方法,出错了,求解决啊~!
  1. package shiyan;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Method;

  4. public class ShiYan3 {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) throws Exception{
  9.                 // TODO Auto-generated method stub
  10.                 Constructor c = Class.forName("shiyan.PrintStr").getConstructor(String.class);
  11.                 String s =(String)c.newInstance("kkkkkkkkkk");
  12.                 Method m =Class.forName("shiyan.PrintStr").getMethod("printStr", String.class);
  13.             System.out.println(m.invoke(s, "dsgfdsgdsg"));
  14.                
  15.         }

  16. }


复制代码
下面是我要进行反射操作的类
  1. package shiyan;

  2. public class PrintStr{
  3.         private String str;

  4.         public PrintStr(String str){
  5.                  this.str = str;
  6.         }
  7.         public static void printStr(String str){
  8.                 System.out.println(str.toString());
  9.                
  10.         }
  11.        
  12. }
复制代码

作者: 张小庆    时间: 2012-4-28 19:08
忘了把错误贴上了:
Exception in thread "main" java.lang.ClassCastException: shiyan.PrintStr cannot be cast to java.lang.String
        at shiyan.ShiYan3.main(ShiYan3.java:14)

作者: 张文建    时间: 2012-4-28 20:32
public static void main(String[] args) throws Exception{

                // TODO Auto-generated method stub

                                Constructor<String> c = String.class.getConstructor(StringBuffer.class);

                String s =(String)c.newInstance(new StringBuffer("kkkkkkkkkk"));
               
                System.out.println(s);
               
                String shiyanPrintStr = " ";
               
                                PrintStr pst = new PrintStr("dsgfdsgdsg");
                               
                Method m =Class.forName(shiyanPrintStr).getMethod("PrintStr", String.class);
              
                m.invoke(null,pst);



public class PrintStr{

        //private String str;


        public PrintStr(String str){

            //this.str = str;   
                System.out.println(str);

        }

        /*public static void printStr(String str){

                System.out.println(str.toString());

               
        }
*/
        
}

小改了一下你代码
能反射PrintStr方法
但还是有错误。。。。。
作者: 根号5    时间: 2012-4-28 22:15
本帖最后由 根号5 于 2012-4-28 22:17 编辑

好像没这样调用的吧,你这样做很显然会出现类型转换异常
这是你的代码:
Constructor c = Class.forName("shiyan.PrintStr").getConstructor(String.class);

                String s =(String)c.newInstance("kkkkkkkkkk");

                Method m =Class.forName("shiyan.PrintStr").getMethod("printStr", String.class);

你反射的构造方法是PrintStr的,而你用反射的对象调用c.newInstance("kkkkkkkkkk"),这样返回的应该是PrintStr类型的对象,你怎么能强转为String类型的呢,所以错误出在这个地方
你的意思是想把str的值有“kkkkkkkk”改为“dsgfdsgdsg”吧,应该这样做,代码如下:
package com.bosi;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ShiYan3 {

        public static void main(String[] args) throws Exception{


                Constructor c = Class.forName("com.bosi.PrintStr").getConstructor(String.class);

                PrintStr s =(PrintStr)c.newInstance("kkkkkkkkkk");

                Method m =Class.forName("com.bosi.PrintStr").getMethod("setStr", String.class);
                m.invoke(s, "dsgfdsgdsg");
                System.out.println(s.getStr());//这里会打印出你要改的值  dsgfdsgdsg   
         }
}
下边是你要反射的类:
package com.bosi;

public class PrintStr {
    private String str;
    public PrintStr(String str){

             this.str = str;
    }
    /*public static void printStr(PrintStr str){

            System.out.println(str.toString());
    }*/
        public String getStr()
        {
                return str;
        }
        public void setStr(String str)
        {
                this.str = str;
        }
}

在第二段代码里设置setStr(),getStr()方法,这样话就可以把由构造方法所初始化的数值改为你想要的。


作者: 金超    时间: 2012-4-28 23:00
看注释
package shiyan;



import java.lang.reflect.Constructor;

import java.lang.reflect.Method;



public class ShiYan3 {



        /**

         * @param args

         */

        public static void main(String[] args) throws Exception{

                // TODO Auto-generated method stub

                Constructor c = Class.forName("shiyan.PrintStr").getConstructor(String.class);

                String s =(String)c.newInstance("kkkkkkkkkk");  // 改成 Object s =(Object)c.newInstance("kkkkkkkkkk");  在调用 c.newInstance();的时候返回的是实例化的对象,不是字符串。
                Method m =Class.forName("shiyan.PrintStr").getMethod("printStr", String.class);

            System.out.println(m.invoke(s, "dsgfdsgdsg"));

               

        }



}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2