Invoke a subclass method via Superclass reference variable.

Hello,
I need to invoke 'subclass' methods from a superclass reference variable as each subclass has a different
methods and behaviour.
My query is
In the Main, when I invoke product.getProductType(),I get a reference back to the Product.
I need a reference to the subclass object so that I can invoke methods of that subclass.
How can I get the required subclass type and invoke methods specific to the subclass?
Is my design incorrect?
abstract class Product {
     public abstract Product getProductType();
class Bond extends Product{
     @Override
     public Bond getProductType(){
          return this;
     // Methods specific to Bond
     public String getBondIssuer(){
     public Long getBondFaceValue(){
class Option extends Product {
     @Override
     public Option getProductType(){
          return this;
     // Methods specific to Options
class Main {
     public static void main(String args[]){
          Product product = new Bond();
          product.getProductType();  // Here I  get get a reference back to Product.
                            // What I need is a reference to the subclass type (Bond) so that I can invoke Bond methods
}

If your client already knows it has a Bond it should just use that as a reference. If you have general handling functions or classes, you can make them generic so that even if you give them a Product they can return the specific sub class.
Simplest example:
Bond james = doSomethingWithAProduct(new Bond());
public <T extends Product> T doSomethingWithAProduct(T product) {
   return product;
}

Similar Messages

  • Invoking a procedure/method via a string

    I know this is probably a long shot, but I will ask anyway...
    What I would like to do is invoke a procedure/method in a class/package which is not the current one by building a string which makes up the call and the parameters and then running it somehow. PLUS, I would like to receive a return value or object from the call....
    eg.
    String command = "getname(id)";
    retval = dummy.execute(command);
    I have looked at RMI, but it does not seem to go this far...
    suggestions would be much appreciated...

    I know this is probably a long shot, but I will ask
    anyway...
    [snip]
    I have looked at RMI, but it does not seem to go this
    far...
    suggestions would be much appreciated...What you are looking for is not RMI, but Reflection.
    Specifically, you will be performing roughly the steps, as explained by calling the String.indexOf(String) method...// import java.lang.reflect.*;
    // Identify the object being called
    Object methodOwner = "This is a test";
    // Identify the class containing the method definition
    Class methodClass = String.class;
    // Identify the method parameters
    Class[] paramTypes = new Class[] { String.class };
    // Find the method *1
    Method method = methodClass.getMethod("indexOf", paramTypes);
    // Create the argument list
    Object[] params = new Object[] { "test" };
    // Invoke the method *2
    Object result = method.invoke(methodOwner, params);
    System.out.println(result); // Prints the Integer with value 10Note that exceptions may be thrown at marks *1 and *2, of which the InvocationTargetException at *2 will probably of most interest, meaning that an exception ocurred in the method being invoked - the exception that was thrown can be found by the getTargetException() method on the InvocationTargetException.
    Hope this helps,
    -Troy

  • Superclass variable not calling subclass method

    hi,
    i've got a bit of a problem with my method invocation. i'll try to explain in abstract terms:
    class SuperClass {
    void method(int x){
    //some action
    class SubClass extends SuperClass {
    static final int VARIABLE = 1;
    void method(int x){
    x = modify(x);
    super.method(x)
    int modify(int x){
    return x += VARIABLE;
    my problem is that i've got about 20 or so subclasses that i refer to through a superclass reference. as i understand it, i should be about to call:
    int result = superClassRef.method(5);
    and this will call the subclass method, perform the modification and return the result. my problem is twofold.
    1) the superclass reference dosen't call the subclass's method
    2) what happens when it gets to the subclass's modify method and trys to access the subclass's VARIABLE through a superclass reference? as i understand it shouldn't be accessible from the superclass reference.
    hmmm...any help would be most appreciated.
    cameron

    that was what i ment -
    SuperClass superClassRef = new SubClass();
    superClassRef.method(5); //dosen't return anything
    i think this may be turning into a more wide ranging application problem. i tried to bypass the natural superclass method invocation with the following code:
    Method m = superClassRef.getClass().getMethod("method");
    m.invoke(superClassRef, new Object[]{new Integer(x)});
    but on trying this it throws an InvocationTargetException.
    for clarity - the two methods in the subclass are:
    void method(int x) (overrides the superclass's method(int x))
    and
    int modify(int x)
    sorry for the bad naming.
    i've figured out the variable thing - i'd only be if there were variable shaddowing in the subclass that problems could arrise.

  • Invoking methods via java.lang.Method.invoke().

    I need to invoke the getter methods that I have defined for a Trade object passed as an argument.
    I am getting the excepion : java.lang.IIlegalArgumentException: wrong number of arguments.
    This is the first time I am invoking methods this way.
    Am I correct to assume that methods on an object can be invoked in this way?
    How can I invoke the getter methods of the trade object.
    Please help.
    public void displayData(Trade trade){
         Method[] m = trade.getClass().getMethods();
         for(int i=0;i<m.length;i++){
              if(m.getName().startsWith("get")){
                        try {
                             m[i].invoke(trade, new Trade[] { trade });
                        } catch (IllegalArgumentException e) {
                             e.printStackTrace();
                        } catch (IllegalAccessException e) {
                             e.printStackTrace();
                        } catch (InvocationTargetException e) {
                             e.printStackTrace();

    bhuru_luthria wrote:
    The getter methods of the trade object require no arguments.
    The three getter methods of the trade object are:
    getTradeId();
    getProductId()
    getReferenceId()Read the Javadoc; use it like this:
    m.invoke(trade);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • Calling a method via invokeMethod (JDI)

    Hi !
    Does anybody know how to invoke a method
    via the invokeMethod method of the Java Debug Interface (JDI).
    This suspends the execution of the program !
    I've read somewhere that the vm must be resumed,
    but I don't see how, as a vm.resume() after the
    invocation is never reached !
    Thanx for any help !
    Alex

    I have the same problem ..Null pointer exception thrown. here is my sample code that I did:
    public void methodExitEvent(MethodExitEvent event)
    ObjectReference obj = objectReference(event);
    if(obj!=null && !event.method().name().equals("<init>"))
    System.out.println(" Leaving the method " + event.method().name() + "() Object " + obj.hashCode());
    List objMethodsList= event.method().declaringType().methodsByName("methodA");
    Method emptyState= (Method)objMethodsList.get(0);
    //ClassType myClass= (ClassType)obj.referenceType();
    //Method emptyState= myClass.concreteMethodByName("methodA","()V");
    try
    Value myValue= obj.invokeMethod(event.thread(), emptyState ,null,ObjectReference.INVOKE_SINGLE_THREADED);
    catch(Exception e)
    e.printStackTrace();
    System.out.println("Error in invoking method "+e.getMessage());
    else if(obj!=null && event.method().name().equals("<init>"))
    System.out.println("Object " + obj.hashCode()+" END its life");
    and here is the trace that i got from the exception thrown:
    java.lang.NullPointerException
    at com.sun.tools.jdi.MirrorImpl.validateMirrorsOrNulls(MirrorImpl.java:8
    2)
    at com.sun.tools.jdi.ObjectReferenceImpl.invokeMethod(ObjectReferenceImp
    l.java:355)
    at EventThread.methodExitEvent(EventThread.java:186)
    at EventThread.handleEvent(EventThread.java:69)
    at EventThread.run(EventThread.java:35)
    Error in invoking method null
    Need help ASAP especially those of you who have created debugger. Im trying to create a tracer and try to invoke the method of the debugee object....

  • Strange about invoking web service method declared “string  method(void)”;

    Dear forum readers
    I’m experimenting with OpenESB and web services. I’ve create a simple web service using NetBeans 6.1. The method consists of a single method, getTime, that is declared:
    String getTime()
    My current experiment is to invoke this method from a BPEL-process using the “Invoke” process object. The strange thing is that it seems like I have to provide a “dummy” inbound variable from the BPEL-designer even though the method doesn’t take any parameters. I include a snippet from the BPEL process below which includes the section where I set the dummy GetTimeIn-variable and then invokes the WS method getTime().
    <assign name="Assign2">
    <copy>
    <from>'DummyValue'</from>
    <to variable="GetTimeIn" part="parameters"/>
    </copy>
    </assign>
    <invoke name="Invoke1" partnerLink="PartnerLink1" operation="getTime" xmlns:tns="http://ws/" portType="tns:MyWebService" outputVariable="GetTimeOut" inputVariable="GetTimeIn"/>
    If I don’t initiate the dummy variable or remove it altogether, I can’t successfully call the method. If I include the dummy in-parameter the call works just fine and I get back the current time as a string.
    I must admit that I’m still a rookie to web services, especially when calling them from a BPEL-process, so it may be a very trivial reason for this behaviour. Anyway, any help on this matter would be greatly appreciated.
    Regards, Ola

    Thank you both for the response. Regarding Rennay’s posting I have an additional question. When I create a new web service I don't have the "Document Literal" option nor a "Concrete Configuration" tab. I've created the web service using the "Web Application" project type and then adding a web service using the "Web Service..." wizard. This wizard doesn't have the configuration properties you mention, but if I add a WSDL-file to a BPEL-project the wizard has the properties you mention.
    Is it possible to create a web service, programmed as an ordinary Java-class, from an existing WSDL-file? In that case it may solve the problem with the “Document Literal” property. Currently I don’t know any other way to create such a web-service other than the through the web service wizard in a web application project. Of course, it’s possible to craft it from scratch but that’s to much work to be practical.
    Regards, Ola

  • Access of undefined method/property through reference with a static type Class

    I get the following error: (it's not word for word but you get the idea)
    Error: Access of undefined method getStatus through reference with a static type Class.
    Here's what's happening in the code. I'm trying to create a User class that is instantiated at the start of my app. I want the User class to have properties like mainStatus, with helper methods like setStatus etc. Pretty simple.
    so on my HardDisk I have my flash_working folder with all my flash projects. I created my class file/package under the directory com.mypackage
    package com.mypackage
        import flash.display.*;
        public class User extends Sprite
            public var mainStatus:int;
            public function User()
                trace("User Created!");
                mainStatus = 0;
            public function setStatus(status:int):void
             mainStatus = status;
        public function getStatus():int
            return mainStatus;
    Ok, so far so good.
    now I created a new .fla file under the root of /flash_working/. The class file is in /com/mypackage/User.as
    in my .fla file I have:
    import com.mypackage.User;
    var myUser:User = new User();
    var i = User.getStatus();
    trace(i);
    That's all the code I have. Could someone please explain why it's giving me that error?
    If I try to access the public var mainStatus through user.mainStatus that gives a similar error saying:
    Error: Access of undefined property mainStatus through reference with a static type Class.
    Thanks for any help!
    jef3189

    the public getStatus() function that you created needs to be referred to through an instance of the class.
    So:
    import com.mypackage.User;
    var myUser:User = new User();
    var i = myUser.getStatus();
    trace(i);
    Also, an aside. You can create a getter/setter for status, to avoid having to do the function as such.
    package com.mypackage
        import flash.display.*;
        public class User extends Sprite
            public var mainStatus:int;
            public function get status():int
                return mainStatus;
            public function set status(value:int):void
                 mainStatus = value as int;
              public function User()
                trace("User Created!");
                mainStatus = 0;
    And then, you can call it as:
    import com.mypackage.User;
    var myUser:User = new User();
    trace(myUser.status);
    EDIT
    I just noticed that you made the variable public as well, which means you can access it without getter/setter or function.
    import com.mypackage.User;
    var myUser:User = new User();
    trace(myUser.mainStatus);

  • Not able to Pass Reference Variables to Deferred task

    Hi All,
    I am not able to Pass the reference variables to Deferred task, With the following code, I am getting null values (for the passed refs) in Deferred Task.
    Code is as:
    <Action id='1' name='Set Deferred Task Action' application='com.waveset.session.WorkflowServices'>
    <Argument name='op' value='addDeferredTask'/>
    <Argument name='type' value='User'/>
    <Argument name='name' value='$(empId)'/>
    <Argument name='authorized' value='true'/>
    <Argument name='task' value='WF_User Deferred Task'/> // Task defination
    <Argument name='date'>
    <Date>2008-11-19T14:50:18.840Z</Date>
    </Argument>
    <Argument name='taskDefinition'>
    <block trace='true'>
    <defvar name='usrObject'> // This is the variable I am passing to 'WF_User Deferred Task'
    <new class='com.waveset.object.GenericObject'/>
    </defvar>
    <invoke name='setAttributes'>
    <ref>usrObject</ref>
    <map>
    <s>accId</s>
    <ref>empId</ref>
    <s>updStatus</s>
    <ref>newStatus</ref>
    </map>
    </invoke>
    </block>
    </Argument>
    </Action>
    <Transition to='End'/>
    Please suggest me.
    Thanks,
    Ravi.

    yeah, you don't have your usrObject available in the deffered task however all variables that you put inside the usrObject are avialble. Like <ref>accId<ref> and <ref>updStatus</ref>. If you still need them organized hierarchically, you might try to add one more level to the object before passing it to addDefferedTask
                <block>
                  <defvar name='objWrapper'>
                    <new class='com.waveset.object.GenericObject'/>
                  </defvar>
                  <defvar name='usrObject'>
                    <new class='com.waveset.object.GenericObject'/>
                  </defvar>
                  <invoke name='setAttributes'>
                    <ref>usrObject</ref>
                    <map>
                      <s>accId</s>
                      <s>yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy</s>
                      <s>updStatus</s>
                      <s>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</s>
                    </map>
                  </invoke>
                  <invoke name='setAttributes'>
                    <ref>objWrapper</ref>
                    <map>
                      <s>usrObject</s>
                      <ref>usrObject</ref>
                    </map>
                  </invoke>
                  <ref>objWrapper</ref>
                </block>I hope you ve got the idea. Cheerz.

  • Why is the ejbstore() called when i invoke any getter method of my bean ?

    Hi All,
    I have designed one enterprise bean with three attributes title , type and date.
    and i have implemented getter and setter method for these member variables.
    When i call any one of getter methods,
    the output at server as follows :
    getTittle();
    ejbStore();
    getType();
    ejbStore();
    I want to know why the ejbStore() is called as soon as i called any one of getter methods.
    I heard ejbLoad() and ejbStore() are invoked by container based on transaction attribute.
    I even set "Never" as transaction attribute . Still i got a same type of output.
    Could you explain me why it happens ?
    Thanks in advance,
    nvseenu

    Hi magesh ,
    Hi
    ejbStore is called if any of the three is true:
    . A tx completes and the bean participated in the Tx
    and atleast one business method was called. Note that
    getters are also business methods.
    2. A Finder method is called within the tx, which
    causes ejbStore() to be called by the container
    (before the finder executes)
    3. The method is marked using
    "flush-et-end-of-method" attribute in
    sun-ejb-jar.xml.
    I understood the concepts explained here.
    >
    I am surprised that TX_NENVER causes ejbStore(). Can
    you send us the ejb-jar.xml and sun-ejb-jar.xml?The thing which confuse me is why ejbStore() is called for Transction attribute
    "Never".
    My ejb-jar.xml file is as follows:
    <!DOCTYPE ejb-jar PUBLIC
         "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
         "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
    <ejb-jar>
    <enterprise-beans>
    <entity>
    <ejb-name>BarronsEJB</ejb-name>
    <home>test.BarronsHome</home>
    <remote>test.Barrons</remote>
    <ejb-class>test.BarronsBean</ejb-class>
    <persistence-type>Bean</persistence-type>
    <prim-key-class>test.BarronsPK</prim-key-class>
    <reentrant>false</reentrant>
    <resource-ref>
    <res-ref-name>jdbc/MySqlDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    </entity>
    </enterprise-beans>
    <assembly-descriptor>
    <container-transaction>
    <method>
    <ejb-name>BarronsEJB</ejb-name>
    <method-intf>Remote</method-intf>
    <method-name>*</method-name>
    </method>
    <trans-attribute>Never</trans-attribute>
    </container-transaction>
    </assembly-descriptor>
    </ejb-jar>
    BarronsBean has three member variables " id , title , type " and gettter and setter methods for these variables.
    I use JBoss App Server to run EJB.
    I feel information i have given here may be enough to you to explain me why ejbStore() is called after any one of the getter / setter method is invoked.
    Thanks in advance,
    nvseenu

  • Overriding Interface methods via JNI

    Hello,
    How we can override Interface methods via JNI?
    For example:
    At HelloWorldSwing example:
    http://download.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java
    I've written anonymous Interface as:
    import javax.swing.*;       
    public class HelloWorldSwing1 {
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("HelloWorldSwing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Add the ubiquitous "Hello World" label.
            JLabel label = new JLabel("Hello World");
            frame.getContentPane().add(label);
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        static Runnable runnableObject = new Runnable() {
             public void run() {
                  createAndShowGUI();              
       public static void main(String[] args) {
             //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            SwingUtilities.invokeLater(runnableObject);
    }via JNI functions(http://download.oracle.com/javase/1.4.2/docs/guide/jni/spec/functions.html) we cannot override Runnable Interface's run method? Can we?
    Only:
    RunnableClass's value isn't null with given example at below. FindClass finds the Runnable Interface.
    jclass RunnableClass;
    RunnableClass = (*env)->FindClass(env,"java/lang/Runnable");
      if( RunnableClass == NULL ) {
        printf("can't find class Runnable\n");
        exit (-1);
      }But How can we override Runnable class's run method?
    Thanks in Advance

    The only way you can override a method in Java is by defining a class that does so, either statically or as an anonymous inner class. You can't do either of those things in JNI. Ergo you cannot do what you are asking about.

  • FATAL ERROR in native method: Wrong method ID used to invoke a Java method

    When calling the same method second time , I get message ::
    <FATAL ERROR in native method: Wrong method ID used to invoke a Java method>
    void myFunction(int myVal)
    JNIEnv *env = NULL;
    jclass odbcconnls;
    jint res;
    printf("\nInitilaizing class ");
    res = (jvm)->AttachCurrentThread((void **)&env,NULL);
    if (res < 0) {
    fprintf(stderr, "Can't get Env \n");
    (jvm)->DestroyJavaVM();
    return SQL_ERROR;          
    if(res == JNI_OK)
    printf("\nThe env is initialized ");
    if(*(&env) == NULL)
    printf(" the env is NULL ");
    printf("\nenv :::::: %s ", env);     
    // the jobject (dbc->actualConn) is a global reference
    odbcconnls = (env)->GetObjectClass(dbc->actualConn);
    if (odbcconnls == NULL) {
    goto destroy;
    switch(myVal){
    case 1:
    jmethodID methodId ;
    jboolean jbool;
    SQLINTEGER Val = (SQLINTEGER )Value;
    SQLINTEGER val1 = *Val;
    methodId = (env)->GetMethodID( odbcconnls,"myFun1","(Z)V");
    if(methodId == NULL){
    goto destroy;
    if(val1 == SQL_FALSE )
    jbool = 0;
    else
    jbool =1;
    env->CallVoidMethod(dbc->actualConn,methodId,jbool);
    env->DeleteLocalRef((jobject)res);
    env->DeleteLocalRef((jobject)odbcconnls);
    env->DeleteLocalRef((jobject)methodId);
    jvm->DetachCurrentThread();
    return ;
    case 2 :
    jmethodID methodId1 ;
    SQLUINTEGER* Level;
    methodId1 = (env)->GetMethodID( odbcconnls,"myFun2","(I)V");
    if(methodId1 == NULL){
    goto destroy;
    Level = (SQLUINTEGER *)Value;
    env->CallVoidMethod(dbc->actualConn,methodId1,(int)*Level);
    dbc->txn_isolation = (SQLUINTEGER)Value;
    env->DeleteLocalRef((jobject)res);
    env->DeleteLocalRef((jobject)odbcconnls);
    env->DeleteLocalRef((jobject)methodId1);
    jvm->DetachCurrentThread();
    return ;
    case 3 :
    SQLCHAR* Cate;
    jmethodID methodId2 ;
    jstring jStrCat;
    methodId2 = (env)->GetMethodID(odbcconnls,"myFun3","(Ljava/lang/String;)V");
    if(methodId2 == NULL){
    goto destroy;
    Cate = new SQLCHAR[20];
    strcpy((char *)CCatalog,(char *)Value);
    jStrCat = env->NewStringUTF((char *) Cate);
    printf("\n got jSTring ");
    env->CallVoidMethod(dbc->actualConn,methodId2,jStrCat);
    printf("\n after called method ");
    int len = strlen((char *)Cate);
    dbc->Cate = new SQLCHAR[len+1];
    strcpy((char *)dbc->Cate,(char *)Cate);
    printf("\n copied result ");
    env->DeleteLocalRef((jobject)res);
    env->DeleteLocalRef((jobject)odbcconnls);
    env->DeleteLocalRef((jobject)methodId2);
    jvm->DetachCurrentThread();
    return ;
    destroy:
    if ((env)->ExceptionOccurred()) {
    (env)->ExceptionDescribe();
    jvm->DetachCurrentThread();
    (jvm)->DestroyJavaVM();
    return SQL_ERROR;
    When case 1 is called second time this error is thrown..
    plz help me..
    Thanx
    MittalSunita.

    When calling the same method second time , I get
    message ::
    <FATAL ERROR in native method: Wrong method ID used
    d to invoke a Java method>
    void myFunction(int myVal)
    JNIEnv *env = NULL;
    jclass odbcconnls;
    jint res;
    printf("\nInitilaizing class ");
    res = (jvm)->AttachCurrentThread((void **)&env,NULL);
    if (res < 0) {
    fprintf(stderr, "Can't get Env \n");
    (jvm)->DestroyJavaVM();
    return SQL_ERROR;          
    if(res == JNI_OK)
    printf("\nThe env is initialized ");
    if(*(&env) == NULL)
    printf(" the env is NULL ");
    printf("\nenv :::::: %s ", env);     
    // the jobject (dbc->actualConn) is a global
    reference
    odbcconnls = (env)->GetObjectClass(dbc->actualConn);
    if (odbcconnls == NULL) {
    goto destroy;
    switch(myVal){
    case 1:
    jmethodID methodId ;
    jboolean jbool;
    SQLINTEGER Val = (SQLINTEGER )Value;
    SQLINTEGER val1 = *Val;
    methodId = (env)->GetMethodID(
    ( odbcconnls,"myFun1","(Z)V");
    if(methodId == NULL){
    goto destroy;
    if(val1 == SQL_FALSE )
    jbool = 0;
    else
    jbool =1;
    env->CallVoidMethod(dbc->actualConn,methodId,jbool);
    env->DeleteLocalRef((jobject)res);
    env->DeleteLocalRef((jobject)odbcconnls);
    env->DeleteLocalRef((jobject)methodId);
    jvm->DetachCurrentThread();
    return ;Why do you delete a local reference???
    Did you ever call the get local reference?
    case 2 :
    jmethodID methodId1 ;
    SQLUINTEGER* Level;
    methodId1 = (env)->GetMethodID(
    ( odbcconnls,"myFun2","(I)V");
    if(methodId1 == NULL){
    goto destroy;
    Level = (SQLUINTEGER *)Value;
    env->CallVoidMethod(dbc->actualConn,methodId1,(int)*Le
    el);
    dbc->txn_isolation = (SQLUINTEGER)Value;
    env->DeleteLocalRef((jobject)res);
    env->DeleteLocalRef((jobject)odbcconnls);
    env->DeleteLocalRef((jobject)methodId1);
    jvm->DetachCurrentThread();
    return ;
    case 3 :
    SQLCHAR* Cate;
    jmethodID methodId2 ;
    jstring jStrCat;
    methodId2 =
    (env)->GetMethodID(odbcconnls,"myFun3","(Ljava/lang/St
    ing;)V");
    if(methodId2 == NULL){
    goto destroy;
    Cate = new SQLCHAR[20];
    strcpy((char *)CCatalog,(char *)Value);
    jStrCat = env->NewStringUTF((char *) Cate);
    printf("\n got jSTring ");
    env->CallVoidMethod(dbc->actualConn,methodId2,jStrCat)
    printf("\n after called method ");
    int len = strlen((char *)Cate);
    dbc->Cate = new SQLCHAR[len+1];
    strcpy((char *)dbc->Cate,(char *)Cate);
    printf("\n copied result ");
    env->DeleteLocalRef((jobject)res);
    env->DeleteLocalRef((jobject)odbcconnls);
    env->DeleteLocalRef((jobject)methodId2);
    jvm->DetachCurrentThread();
    return ;
    destroy:
    if ((env)->ExceptionOccurred()) {
    (env)->ExceptionDescribe();
    jvm->DetachCurrentThread();
    (jvm)->DestroyJavaVM();
    return SQL_ERROR;
    When case 1 is called second time this error is
    thrown..
    plz help me..
    Thanx
    MittalSunita.

  • Jdev 10g UIX: invoking an appmodule method inline

    Hello,
    I'm using ADF UIX in Jdev10g. I have a UIX table bound to a ViewObject, which works great. What I'm now trying to do is to create an extra column on this table which displays the result of a method call (from the AppModule). This method call takes some column data from the current row as parameters. (This fn can't be implemented in SQL as calculated col in the SQL query).
    I know how to call this method via an event (from a FireAction), but this needs to be called every time a new row is rendered in the table.
    So, is there a way to dynamically call an event while UIX renders the page, or is there a way to directly call this method?
    My event hander looks something like:
    <event name="calcit" source="*">
    <invoke method="doIt" instance="${bindings.Calc}" type="..JUCtrlActionBinding">
    <parameters>
    <parameter .... value="${uix.current.Field1}"/>
    </parameters>
    </invoke>
    </event>
    Thanks for any help,
    Matt

    You may implement a transient attribute on the ViewObject that in it's getter performs the equivalent logic of calculating the extra attribute value based on that row's data.
    Then simply bind to that attribute in a UI table binding and you should get the equivalent of 'calling a method to calculate this value'.
    Note that if this value changes based on changes in dependent attributes, you also need to send appropriate change notifications for the transient attribute so that it's value is refreshed for the clients. See ADFToyStore sample on OTN on how to send change notifications.

  • Casting a subclass into a superclass?

    So, I have this exercise that demonstrates abstraction and interfaces. I wanted to explore it a little more. Let me start by showing the code:
    public class TestAnimals {
         public static void main (String [] args){
              Fish f = new Fish();
              Cat c = new Cat("Fluffy");
              Animal a = new Fish();
              Animal e = new Spider();
              Pet p = new Cat();
              Animal [] pets = new Animal[5];
              pets[0] = new Cat("Tiger");
              pets[1] = new Cat("Mama");
              pets[2] = new Spider();
              pets[3] = new Fish("Flipper");
              pets[4] = new Fish("Jaws");
              //demonstrate different implementations of an interface
              f.play();
              c.play();
              //demonstrate virtual method invocation
              e.eat();
              e.walk();
              //demonstrate calling super methods
              a.walk();
              //demonstrate calling super methods
              for (int i=0;i<pets.length; i++){
                   System.out.println("------------");
                   pets.walk();
                   pets[i].eat();
                   if (pets[i] instanceof Cat){
                        pets[i].play();
    this won't compile, because play() is not a method of Animal, it's a method of subclass Cat. Having an array of animals, and interating through the array, I want it to make the Animal play() if it is a Cat. How do I do that?

    Ok, thanks. I did try to cast it, but I did it like
    this:
    pets[i] =(Cat)pets;
    pets[i].play();
    Which didn't work, and I don't understand why.
    That doesn't work because the pets array is declared to be an array of Animal, so even if you cast one of them to a Cat, as soon as you put it back in the array it turns into an Animal again. Do it the way Herko_ter_Horst   suggested and it will work.
    Also, you noted that calling a subclass method from a
    superclass is typically indicitive of bad design, but
    how would I do this properly? I mean, if I wanted to
    have an Array of different types of Animals, but
    wanted the animals to do different things depending
    on what they are, why wouldn't I want to do it this
    way? I can't create a Fish in the Cat class, so I
    can't use a Cat[], and so the only way to have an
    array with a Fish and a Cat is to make an Animal[].
    Can you tell me what would be correct?
    If each type of animal has one action it can perform that is different for each animal, then declare an abstract method performAction in the Animal class and implement in differently for each type of animal. e.g. for the cat you might do it as:public void performAction()
    play();
    }That way you can call performAction on any Animal without casting and it will perform the correct action for each type of animal.
    Sorry in advance if this is too simple of a question
    for this forum. I am currently going through the Java
    programming course WJ-2753, and am not sure where
    else I can ask these questions...No question is too simple. As long as it's asked politely and clearly and you're not expecting someone to do all your work for you.

  • Should i set null those reference variable object created inside of funtion

    hi,
    I create object inside of a member function . after finish execute that method those variable should set null to be garbage collection or no need ?
       public void sampleFun(){
           Object obj = new Object();
            // some work
         obj = null ;  //// ----------- > this need or not ?
    }after finished that method execution should i set
       obj = null;explicitly or no need ?? plz

    No, there's no need.
    When the reference variable passes out of scope, it ceases to exist, so it doesn't reference the object any more. As soon as an object has no references pointing to it, it is available for garbage collection.
    Your rule of thumb should be: don't do anything about garbage collection unless you know why you're doing it. And even then don't do it unless you can prove you need to.
    Dave.

  • SSO to a weblogic application via a header variable, possible?

    Hi
    Is it possible to provide single sign on to a weblogic application via a header variable?
    We would like to follow a similar model to what's used with OC4J at:
    http://download.oracle.com/docs/cd/E10761_01/doc/oam.1014/e10356/osso.htm#BJFJBCHB
    Any feedback is appreciated.

    Yes this is possible via a custom Identity Assertion Provider if you are using Weblogic security. You can write the J2EE provider to extract the header and map the user to a LDAP user when you configure the authentication provider to use the same user store as OAM.

Maybe you are looking for