জাভাতে a.getClass () এবং A.class এর মধ্যে পার্থক্য কী?


101

জাভা কি অনুকূল / কনস ব্যবহার করতে পছন্দ পার্শ্ববর্তী অস্তিত্ব a.getClass()বা A.class? হয় যেখানেই Class<?>প্রত্যাশিত যেখানেই ব্যবহার করা যেতে পারে , তবে আমি ধারণা করেছি যে বিভিন্ন পরিস্থিতিতে উভয়ই ব্যবহার করার ক্ষেত্রে পারফরম্যান্স বা অন্যান্য সূক্ষ্ম বেনিফিট (যেমন রয়েছে Class.forName()এবং যেমন রয়েছে তেমন) ClassLoader.loadClass()

উত্তর:


163

আমি তাদের উপকারের দিক থেকে তুলনা করব না কারণ তাদের বিভিন্ন উদ্দেশ্য রয়েছে এবং দুজনের মধ্যে খুব কমই একটি "পছন্দ" রয়েছে।

  • a.getClass()ফেরৎ রানটাইম টাইপ এর a। অর্থাৎ আপনার যদি থাকে A a = new B();তবে ক্লাসটি a.getClass()ফিরে আসবে B

  • A.classAক্লাসে স্থিতিশীলভাবে মূল্যায়ন করে এবং প্রায়শই প্রতিচ্ছবি সম্পর্কিত অন্যান্য উদ্দেশ্যে ব্যবহৃত হয়।

পারফরম্যান্সের ক্ষেত্রে, একটি পরিমাপযোগ্য পার্থক্য থাকতে পারে, তবে আমি এটি সম্পর্কে কিছুই বলব না কারণ শেষ পর্যন্ত এটি জেভিএম এবং / বা সংকলক নির্ভর।


এই পোস্টটি এখানে একটি নিবন্ধ হিসাবে আবার লেখা হয়েছে


2
কীভাবে A.class.getClass()?
ব্যবহারকারী 1870400

5
এটি আপনাকে Classশ্রেণীর A.classঅবজেক্টটিকে উপস্থাপন করবে যা আবার একটি উদাহরণ java.lang.Class
আইয়ুব

কীভাবে A.getClass().class?
শিখর মইনালী

@ শিখারমৈনালী, Aক্লাস হলে সত্যিকার অর্থে তা বোঝায় না । getClassক্লাসে কোনও স্থির পদ্ধতি নেই ।
আইয়ুব

এটি এখানে পরামর্শের সাথে কীভাবে সম্পর্কিত যে তারা বিভিন্ন শ্রেণীর লোডারগুলিকেও নির্দেশ করে। এই দুইয়ের মধ্যে একটি উল্লেখযোগ্য পার্থক্য হতে পারে?
জিম

32

আপনি সেগুলি কোথায় ব্যবহার করতে পারবেন সে সম্পর্কে এগুলি আসলে আলাদা। A.classসংকলন সময়ে কাজ করে যখন a.getClass()টাইপ একটি উদাহরণ প্রয়োজন Aএবং রানটাইম এ কাজ করে।

পারফরম্যান্সের পার্থক্যও থাকতে পারে। যদিও A.classকারণ এটি প্রকৃত টাইপ জানেন কম্পাইলার দ্বারা সমাধান করা যেতে পারে A, a.getClass()একটি ভার্চুয়াল পদ্ধতি রানটাইম এ ঘটছে আহবান।

রেফারেন্সের জন্য, বাইকোডকে টার্গেট করে একটি সংকলক সাধারণত নিম্নলিখিত নির্দেশাবলীটি নির্গত করে Integer.getClass():

aload_1
invokevirtual   #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;

এবং নিম্নলিখিতগুলির জন্য Integer.class:

//const #3 = class  #16;    //  java/lang/Integer

ldc_w   #3; //class java/lang/Integer

প্রাক্তন সাধারণত একটি ভার্চুয়াল পদ্ধতি প্রেরণে জড়িত থাকে এবং সুতরাং সম্ভবত এটি কার্যকর করতে আরও বেশি সময় নেয়। এটি শেষ পর্যন্ত তবে জেভিএম-নির্ভর।


1
[1] প্রযুক্তিগতভাবে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনটিতে কোনও ধ্রুবক পুলের উল্লেখ নেই ...
আইওবে

@ আইউব: আমি অনুমান করি আপনি ঠিক বলেছেন, সেজন্যই আমি সান জেডিকে দ্বারা উত্পাদিত বাইটকোডটি পরীক্ষা করেছি।
টমাসজ নুরকিউইচজ

1
... যা প্রযুক্তিগতভাবে বলতে গেলে কোনও অনুমোদনযোগ্য উত্তর দেয় না, কারণ জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন যখন শব্দার্থবিজ্ঞানের কথা আসে তখন বাইটকোডের কথাও উল্লেখ করে না।
আইয়ুব

@ আইউব: আমি আপনার বক্তব্য পেয়েছি আমি কখনই জেএলএস-এর কথা উল্লেখ করি নি, নিশ্চিতভাবে এটি কীভাবে কাজ করে তা পরীক্ষা করে দেখেছি, কারণ আমি নিশ্চিত ছিলাম না। ওপি কর্মক্ষমতা সম্পর্কে জিজ্ঞাসা করে এবং বাইটকোড পরীক্ষা করে দেখা ভাল ধারণা বলে মনে হয়েছিল। আমার পোস্টটি সম্পাদনা করতে বা দ্বিধাগ্রস্ত বিবৃতিগুলি নির্দ্বিধায় মনে করুন
টমাসজ নুরকিউইচজ

1
আপনি যদি এটি পছন্দ না করেন তবে ফিরে রোল করুন ;-)
আইওবে

8

নীচের উদাহরণগুলি দেখুন

a.getClass()!= A.classউদাহরণস্বরূপ, একটি A এর উদাহরণ নয়, তবে A এর বেনামে উপ শ্রেণীর

a.getClass() টাইপ এ এর ​​উদাহরণ প্রয়োজন


4

আপনার a.getClassযখন ক্লাস / টাইপের উদাহরণ রয়েছে এবং আপনি এটির সঠিক প্রকারটি পেতে চান তখন ব্যবহার করুন। যখন a.classযখন আপনি ব্যবহার করা হয় typeউপলব্ধ এবং আপনি এটি উদাহরণস্বরূপ তৈরি করতে চান।
এছাড়াও getClass()ইনস্ট্যান্সের রানটাইম টাইপ ফেরৎ যখন .classকম্পাইল সময়ে মূল্যায়ন করা হয়।
কর্মক্ষমতা বিবেচনা getClass()এবং .class, .classবেশি ভালো কার্য সম্পাদন হয়েছে getClass()
উদাহরণ:

public class PerfomanceClass {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        long time=System.nanoTime();
        Class class1="String".getClass();
        class1="String".getClass();
        class1="String".getClass();
        class1="String".getClass();

        System.out.println("time (getClass()) :"+(System.nanoTime()-time)+" ns");     


        long time2=System.nanoTime();
        Class class2=String.class;
        class2=String.class;
        class2=String.class;
        class2=String.class;

        System.out.println("time (.class):"+(System.nanoTime()-time2)+" ns");
    }

}

আউটপুট:

time (getClass()) : 79410 ns
time (.class)     : 8032 ns

1

আমি যুক্ত করতে চাই একটি পার্থক্য আছে। আমাদের বলুন যে আপনার ক্লাসের একটি নির্মাণকারীর রয়েছে যা একটি সুপার ক্লাসের সাথে নিচে দেখানো হয়েছে যা একটি ক্লাস অবজেক্ট নেয়। আপনি চান যে যখনই একটি সাবক্লাস অবজেক্ট তৈরি করা হবে সাবক্লাসের ক্লাস অবজেক্টটি সুপার ক্লাসে পাস করা উচিত। নীচের কোডটি সংকলন করবে না কারণ আপনি কোনও কনস্ট্রাক্টরে কোনও উদাহরণ পদ্ধতি কল করতে পারবেন না। সেক্ষেত্রে আপনি যদি প্রতিস্থাপন myObject.getClass()করেন MyClass.class। এটি পুরোপুরি চলবে।

Class MyClass
{
    private MyClass myObject = new MyClass();
    public MyClass()
    {
        super(myObject.getClass()); //error line compile time error
    }
}

2
একই শ্রেণীর উদাহরণ ভেরিয়েবল হিসাবে একই শ্রেণীর উদাহরণ থাকা .... আপনি পুনরাবৃত্তভাবে অবজেক্ট তৈরি করার সাথে সাথে আপনার গাদা স্থানটি শেষ হয়ে যাবে।
অনিকেত ঠাকুর

1

আকর্ষণীয়ভাবে উপরের উদাহরণে বর্ণিত পারফরম্যান্সের পার্থক্যগুলি অন্যান্য কারণে সম্পর্কিত বলে মনে হচ্ছে। 3 টি আলাদা ক্লাস ব্যবহার করে, গড় পারফরম্যান্স প্রায় একই রকম হবে:

import java.util.LinkedHashMap;
public class PerfomanceClass {

public static void main(String[] args) {

    long time = System.nanoTime();
    Class class1 = "String".getClass();
    Class class11 = "Integer".getClass();
    Class class111 = "LinkedHashMap".getClass();

    System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns");

    long time2 = System.nanoTime();
    Class class2 = String.class;
    Class class22 = Integer.class;
    Class class222 = LinkedHashMap.class;

    System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns");
} }

আউটপুট এমন কিছু হবে:

time (getClass()) :23506 ns 
time (.class):23838 ns

এবং কলগুলির ক্রমটি স্যুইচ করার ফলে আরও getClass()দ্রুততর হবে in

import java.util.LinkedHashMap;

public class PerfomanceClass {

public static void main(String[] args) {
    long time2 = System.nanoTime();
    Class class2 = LinkedHashMap.class;

    System.out.println("time (.class):" + (System.nanoTime() - time2) + " ns");

    long time = System.nanoTime();
    Class class1 = "LinkedHashMap".getClass();

    System.out.println("time (getClass()) :" + (System.nanoTime() - time) + " ns");
}}

আউটপুট:

time (.class):33108 ns
time (getClass()) :6622 ns

"3 টি আলাদা ক্লাস ব্যবহার করা হচ্ছে"। তবে getClass () বিভাগে আপনি 3 টি পৃথক ক্লাস ব্যবহার করছেন না। এগুলি সমস্ত স্ট্রিং এবং অতএব getClass সমস্ত দৃষ্টান্তের জন্য java.lang.String প্রদান করবে।
কিলিয়ান

1

p.getClass()যেখানে pকোনও বস্তুর উদাহরণ , সেখানে এই বস্তুর রানটাইম শ্রেণি প্রদান করে ppএমন কোনও ধরণ হতে পারে না যা সংকলন-সময় ত্রুটির কারণ হয়ে দাঁড়ায়, এটি কোনও বস্তুর উদাহরণ হতে হবে।

// B extends A
A a = new B();
System.out.println(a.getClass());
//output: class B

p.classএকটি অভিব্যক্তি। .classবর্গ সিনট্যাক্স বলা হয়। pএক প্রকার এটি কোনও শ্রেণি, ইন্টারফেস বা অ্যারে এবং এমনকি একটি আদিম ধরণের নাম হতে পারে। a.getClass() == B.class

যদি কোনও ধরণের উপলভ্য থাকে এবং কোনও উদাহরণ পাওয়া যায় তবে getClassসেই ধরণের নাম জানতে পদ্ধতিটি ব্যবহার করা সম্ভব । অন্যথায় .classসিনট্যাক্সটি ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.